
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.86] |
![]() |
|
Страницы: (4) 1 2 [3] 4 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Программистам букав мало. Две буквы, это всего pow( 26, 2 ), а три буквы уже pow( 26, 3 ). Хотя последнего тоже мало. Не даром ведь придумали всякие namespace.
И очень жаль, что математики, по прежнему используют всякие ln lg и подобное. Треба водить единый стандарт. |
Сообщ.
#32
,
|
|
|
Славян
Цитата Славян @ Математика: ln-натуральный, log-общий Программирование: log-натуральный, ln-нет такого (букв мало?) В разных языках программирования по разному поэтому могу путать. |
Сообщ.
#33
,
|
|
|
"Децентрализованные" - это что-то доселе невиданное. Денормализованные.
|
Сообщ.
#34
,
|
|
|
Цитата trainer @ "Децентрализованные" - это что-то доселе невиданное. Денормализованные. Да. Авто проверка языка подводит. Без неё у меня в каждом слове по ошибке. |
![]() |
Сообщ.
#35
,
|
|
Вообще-то Стандарт языка определяет систему счисления для представления только целых типов данных. Что касается типов с плавающей точкой, то он рекомендует, но не обязывает, следовать стандарту IEC-559 (он же IEEE-754), а там обязывания какой-то конкретной системы счисления нет. В интерфейсах <cfloat> (float.h) и <limits> определяются константы FLT_RADIX и std::numeric_limits<>::radix. Вот их и надо пользовать, если очень интересно. Последний, согласно Стандарту, для целочисленных типов должен возвращать 2.
Добавлено Цитата Eric-S @ Порядок числа обязательно должен указываться со знаком, поэтому E, определяющая экспоненту однозначно отделяется от E, являющейся частью мантиссы, наличием после себя + или -. Кстати, давно мучит вопрос, а как в экспоненциальной записи, оформить 16-ричное число? Или научная исключительно для 10-ричной? Это, если конечно же не использовать специальный значок юникода, а писать латинскую e. Добавлено В НИИ системотехники, где я имел удовольствие одно время работать, разрабатывался на заказ троичный FPU. Добавлено Цитата Eric-S @ В соответствии с IEEE один самый старший бит в 32-х и 64-битных форматах является неявным. Его значение всегда 1 для нормализованных, бесконечностей и нечисел и всегда 0 для денормализованных и нулей. Первые отличаются от вторых смещённым порядком. Порядки 0 и максимальный зарезервированы для спец.форматов, от 1 до макс-1 - для нормализованных. А вот константа DBL_MANT_DIG возвращает размер мантиссы, для типа long double. Если я конечно правильно понял. И это число, у меня 53. Ха-эм. Ладно, вычтем битик, на знак. |
Сообщ.
#36
,
|
|
|
Eric-S, я вспомнил, что немного забыл раньше
![]() На самом деле, в double число хранится не в явном виде мантисы и порядка (экспоненты), в связи с неявной единицей. Для получения реального значения мантисы, нужно сдвинуть вправо мантису с занесением в первый разряд единицы. И правкой порядка. Порядок вроде бы хранится в "дополнительном коде". Если Вам интересен этот вариант, можно развить )) Напомнили: Цитата Qraizer @ Добавлено 40 минут назад Цитата (Eric-S @ Сегодня, 12:54) А вот константа DBL_MANT_DIG возвращает размер мантиссы, для типа long double. Если я конечно правильно понял. И это число, у меня 53. Ха-эм. Ладно, вычтем битик, на знак. В соответствии с IEEE один самый старший бит в 32-х и 64-битных форматах является неявным. Его значение всегда 1 для нормализованных, бесконечностей и нечисел и всегда 0 для денормализованных и нулей. Первые отличаются от вторых смещённым порядком. Порядки 0 и максимальный зарезервированы для спец.форматов, от 1 до макс-1 - для нормализованных. |
Сообщ.
#37
,
|
|
|
Да ладно. Меня уже всё устраивает. С двоичным представлением, возится лень. Оно мне сейчас не требуется. Но буду иметь в виду.
Разрядность я получил. Как сделать проверку узнал. По ходу выяснилось, что она не нужна. Ну да ладно. Система счисления, у меня задаётся опционально. Какая она там по дефолту, уже не важно. Мой класс делает любую от 2-ричной, до 36-ричной включительно. Сейчас загрузился автоматическим выбором, когда выводить в простом формате, а когда в научном с экспанентой. Добавлено Цитата Qraizer @ Порядок числа обязательно должен указываться со знаком, поэтому E, определяющая экспоненту однозначно отделяется от E, являющейся частью мантиссы, наличием после себя + или -. О! Значит знак обязателен. Это хорошо. Я так и сделал. А нолик обязателен или нет? А то я его выбросил. 1.2e+23 или 1.2e+023 |
Сообщ.
#38
,
|
|
|
Успехов в коде
![]() Цитата Eric-S @ Не забывайте про производительность. Хотя, железо походу не может обеспечить обработку разных систем счисления напрямую.. Интел подкачал С двоичным представлением, возится лень. ![]() |
Сообщ.
#39
,
|
|
|
Цитата Qraizer @ обязывания какой-то конкретной системы счисления нет. В интерфейсах <cfloat> (float.h) и <limits> определяются константы FLT_RADIX и std::numeric_limits<>::radix. Вот их и надо пользовать, если очень интересно. Последний, согласно Стандарту, для целочисленных типов должен возвращать 2. о! Вот даже как. Это везде, куда я вбивал магические двойки, надо подставлять сию константу? Добавлено Цитата simsergey @ Успехов в коде ![]() Спасибо. Вам того же! Добавлено Цитата simsergey @ Не забывайте про производительность. Хотя, железо походу не может обеспечить обработку разных систем счисления напрямую.. О производительности помню. Хотя, частенько оптимизации откладываю. Особенно в плюшках. Нет уж, прокачать обычной алгеброй, куда надёжнее. Особенно когда есть желание поизвращатся. А стандартный функционал отсутствует вообще. Добавлено Цитата Qraizer @ соответствии с IEEE один самый старший бит в 32-х и 64-битных форматах является неявным. Его значение всегда 1 для нормализованных, бесконечностей и нечисел и всегда 0 для денормализованных и нулей. Первые отличаются от вторых смещённым порядком. Порядки 0 и максимальный зарезервированы для спец.форматов, от 1 до макс-1 - для нормализованных. Ха-эм. Так мне что, два бита отнимать? Сколько там реально используется для хранения числа? |
Сообщ.
#40
,
|
|
|
Цитата Eric-S @ А почему 2?Так мне что, два бита отнимать? Сколько там реально используется для хранения числа? В Double реально хранится 52 бита мантисы. При арифметических операциях процессор при рассчетах подразумевает, что их 53, дорисовывая слева 1. К примеру, в памяти 010010101010101, а цп эту запись интерпретирует как 1010010101010101. Но в памяти хранится 52 бита. Почему 2 отнимать? Знак? Так Double занимает 64 бита, из которых: знак числа, порядок и мантиса. Знака мантисы - нет, есть "знак числа", а знак порядка записан в 11 битах порядка, и т.к. порядок представлен в ДК (дополнительный код), то знак порядка хранится там же (не совсем отдельным битом). Double Wiki Для справки, есть еще тип Float, работает по тому же принципу, но предоставляет меньшую точность. Взамен - занимает меньше памяти. Мантиса: 23 бита. Порядок: 8 бит. Знак: 1 бит. |
Сообщ.
#41
,
|
|
|
В десятичных константах в формате с плавающей точкой знак + после буквы e можно не писать.
IEEE-754 задаёт 4 представления с разным количеством бит 16 / 32 (float) / 54 (double) / 128. В C и C++ используются два средних. В качестве long double используется 10-байтовое временное представление процессоров i387. Хотя некоторые компиляторы используют 128-битный формат IEEE |
Сообщ.
#42
,
|
|
|
Цитата amk @ А расскажите поподробнее, а? В качестве long double используется 10-байтовое временное представление процессоров i387. Хотя некоторые компиляторы используют 128-битный формат IEEE |
Сообщ.
#43
,
|
|
|
Начиная отсюда: http://ru.wikipedia.org/wiki/IEEE_754-2008 и далее по ссылкам в тексте.
Добавлено ЕМНИП, в первоначальной версии этого стандарта таки фигурировали 80-битные числа. |
Сообщ.
#44
,
|
|
|
Угу. Стандарт, конечно хорошо. Но я, в конкретном компилере имею float и double. Причом есть long double который sizeof(long double) 64.
А где половинная и учетверённая точность? Добавлено Цитата amk @ В десятичных константах в формате с плавающей точкой знак + после буквы e можно не писать. Ну, это меня интересовало, как раз для не десятичной записи. Например шестнадцатиричной, в которой буква "e" имеет значение 14. И в этом случае, без плюсика не обойтись. "0XFFe+10" Кстати, а в какой системе счисления нужно записывать порядок? В той же или десятичной? Добавлено Цитата simsergey @ А почему 2? Так я и спрашивал, нужно ли что-то отнимать и если да, то сколько. С форматом уже разобрался, спасибо! А вот прогулявшись по описанием стандартов, так и не понял, как записывать 0, NaN и +q и -q? Я так понял, это денормализованные значения? |
Сообщ.
#45
,
|
|
|
Цитата trainer @ Нет, частью стандарта IEEE-754 это представление никогда не было. Оно не соответствует обобщённому формату. Это фсего лишь внутреннее представление чисел в арифметическом сопроцессоре i8087. Более того, судя по ранней документации на i8087 даже инженеры Intel изначально не предполагали использовать его в качестве самостоятельного типа данных (хотя для возможности сохранения состояния процессора предусмотрели возможность его чтения/записи). Просто процессор должен был иметь возможность работать не только с плавающими числами, но и с целыми - 16/32/64 бит - и десятичными - до 20 цифр (включая знак). ЕМНИП, в первоначальной версии этого стандарта таки фигурировали 80-битные числа. Добавлено Да, словосочетание "переполнение мантиссы" для чисел с плавающей точкой не совсем верно. В этом случае мантисса просто сдвигается на один разряд вправо (больше не надо) и к порядку добавляется единица. И вот тут может произойти переполнение порядка. Процессоры с полной реализацией арифметики IEEE выдают результат равный ±∞ (все разряды характеристики ?— единицы, все видимые разряды мантиссы — нули). Кроме того сопроцессор может сформировать при этом прерывание. Те процессоры, которые не поддерживают арифметику на таком уровне просто генерируют прерывание. |