На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (4) 1 2 [3] 4  все  ( Перейти к последнему сообщению )  
> как детектировать переполнение мантиссы в числе с плавающей точкой?
    Программистам букав мало. Две буквы, это всего pow( 26, 2 ), а три буквы уже pow( 26, 3 ). Хотя последнего тоже мало. Не даром ведь придумали всякие namespace.
    И очень жаль, что математики, по прежнему используют всякие ln lg и подобное. Треба водить единый стандарт.
      Славян
      Цитата Славян @
      Математика: ln-натуральный, log-общий
      Программирование: log-натуральный, ln-нет такого (букв мало?)

      В разных языках программирования по разному поэтому могу путать.
        Цитата Pavia @
        И ещё бывают децентрализованные
        "Децентрализованные" - это что-то доселе невиданное. Денормализованные.
          Цитата trainer @
          "Децентрализованные" - это что-то доселе невиданное. Денормализованные.

          Да. Авто проверка языка подводит. Без неё у меня в каждом слове по ошибке.
            Вообще-то Стандарт языка определяет систему счисления для представления только целых типов данных. Что касается типов с плавающей точкой, то он рекомендует, но не обязывает, следовать стандарту IEC-559 (он же IEEE-754), а там обязывания какой-то конкретной системы счисления нет. В интерфейсах <cfloat> (float.h) и <limits> определяются константы FLT_RADIX и std::numeric_limits<>::radix. Вот их и надо пользовать, если очень интересно. Последний, согласно Стандарту, для целочисленных типов должен возвращать 2.

            Добавлено
            Цитата Eric-S @
            Кстати, давно мучит вопрос, а как в экспоненциальной записи, оформить 16-ричное число? Или научная исключительно для 10-ричной?
            Это, если конечно же не использовать специальный значок юникода, а писать латинскую e.
            Порядок числа обязательно должен указываться со знаком, поэтому E, определяющая экспоненту однозначно отделяется от E, являющейся частью мантиссы, наличием после себя + или -.

            Добавлено
            Цитата Pavia @
            В VAX компьютерах была десятичная арифметика реализована прямо в процессоре.
            В НИИ системотехники, где я имел удовольствие одно время работать, разрабатывался на заказ троичный FPU.

            Добавлено
            Цитата Eric-S @
            А вот константа DBL_MANT_DIG возвращает размер мантиссы, для типа long double. Если я конечно правильно понял. И это число, у меня 53. Ха-эм. Ладно, вычтем битик, на знак.
            В соответствии с IEEE один самый старший бит в 32-х и 64-битных форматах является неявным. Его значение всегда 1 для нормализованных, бесконечностей и нечисел и всегда 0 для денормализованных и нулей. Первые отличаются от вторых смещённым порядком. Порядки 0 и максимальный зарезервированы для спец.форматов, от 1 до макс-1 - для нормализованных.
              Eric-S, я вспомнил, что немного забыл раньше :)
              На самом деле, в double число хранится не в явном виде мантисы и порядка (экспоненты), в связи с неявной единицей.
              Для получения реального значения мантисы, нужно сдвинуть вправо мантису с занесением в первый разряд единицы.
              И правкой порядка. Порядок вроде бы хранится в "дополнительном коде".
              Если Вам интересен этот вариант, можно развить ))

              Напомнили:
              Цитата Qraizer @
              Добавлено 40 минут назад
              Цитата (Eric-S @ Сегодня, 12:54)
              А вот константа DBL_MANT_DIG возвращает размер мантиссы, для типа long double. Если я конечно правильно понял. И это число, у меня 53. Ха-эм. Ладно, вычтем битик, на знак.
              В соответствии с IEEE один самый старший бит в 32-х и 64-битных форматах является неявным. Его значение всегда 1 для нормализованных, бесконечностей и нечисел и всегда 0 для денормализованных и нулей. Первые отличаются от вторых смещённым порядком. Порядки 0 и максимальный зарезервированы для спец.форматов, от 1 до макс-1 - для нормализованных.
                Да ладно. Меня уже всё устраивает. С двоичным представлением, возится лень. Оно мне сейчас не требуется. Но буду иметь в виду.

                Разрядность я получил. Как сделать проверку узнал. По ходу выяснилось, что она не нужна. Ну да ладно.

                Система счисления, у меня задаётся опционально. Какая она там по дефолту, уже не важно. Мой класс делает любую от 2-ричной, до 36-ричной включительно.

                Сейчас загрузился автоматическим выбором, когда выводить в простом формате, а когда в научном с экспанентой.

                Добавлено
                Цитата Qraizer @
                Порядок числа обязательно должен указываться со знаком, поэтому E, определяющая экспоненту однозначно отделяется от E, являющейся частью мантиссы, наличием после себя + или -.

                О! Значит знак обязателен. Это хорошо. Я так и сделал.
                А нолик обязателен или нет? А то я его выбросил.
                1.2e+23 или 1.2e+023
                  Успехов в коде :)

                  Цитата Eric-S @
                  С двоичным представлением, возится лень.
                  Не забывайте про производительность. Хотя, железо походу не может обеспечить обработку разных систем счисления напрямую.. Интел подкачал :D
                    Цитата Qraizer @
                    обязывания какой-то конкретной системы счисления нет. В интерфейсах <cfloat> (float.h) и <limits> определяются константы FLT_RADIX и std::numeric_limits<>::radix. Вот их и надо пользовать, если очень интересно. Последний, согласно Стандарту, для целочисленных типов должен возвращать 2.

                    о! Вот даже как. Это везде, куда я вбивал магические двойки, надо подставлять сию константу?

                    Добавлено
                    Цитата simsergey @
                    Успехов в коде :)

                    Спасибо. Вам того же!

                    Добавлено
                    Цитата simsergey @
                    Не забывайте про производительность. Хотя, железо походу не может обеспечить обработку разных систем счисления напрямую..

                    О производительности помню. Хотя, частенько оптимизации откладываю. Особенно в плюшках. Нет уж, прокачать обычной алгеброй, куда надёжнее. Особенно когда есть желание поизвращатся. А стандартный функционал отсутствует вообще.

                    Добавлено
                    Цитата Qraizer @
                    соответствии с IEEE один самый старший бит в 32-х и 64-битных форматах является неявным. Его значение всегда 1 для нормализованных, бесконечностей и нечисел и всегда 0 для денормализованных и нулей. Первые отличаются от вторых смещённым порядком. Порядки 0 и максимальный зарезервированы для спец.форматов, от 1 до макс-1 - для нормализованных.

                    Ха-эм. Так мне что, два бита отнимать? Сколько там реально используется для хранения числа?
                      Цитата Eric-S @
                      Так мне что, два бита отнимать? Сколько там реально используется для хранения числа?
                      А почему 2?
                      В Double реально хранится 52 бита мантисы. При арифметических операциях процессор при рассчетах подразумевает, что их 53, дорисовывая слева 1.
                      К примеру, в памяти 010010101010101, а цп эту запись интерпретирует как 1010010101010101. Но в памяти хранится 52 бита.
                      Почему 2 отнимать? Знак? Так Double занимает 64 бита, из которых: знак числа, порядок и мантиса. Знака мантисы - нет, есть "знак числа", а знак порядка записан в 11 битах порядка, и т.к. порядок представлен в ДК (дополнительный код), то знак порядка хранится там же (не совсем отдельным битом).

                      Double Wiki

                      Для справки, есть еще тип Float, работает по тому же принципу, но предоставляет меньшую точность. Взамен - занимает меньше памяти.
                      Мантиса: 23 бита.
                      Порядок: 8 бит.
                      Знак: 1 бит.
                      Сообщение отредактировано: simsergey -
                        В десятичных константах в формате с плавающей точкой знак + после буквы e можно не писать.

                        IEEE-754 задаёт 4 представления с разным количеством бит 16 / 32 (float) / 54 (double) / 128. В C и C++ используются два средних. В качестве long double используется 10-байтовое временное представление процессоров i387. Хотя некоторые компиляторы используют 128-битный формат IEEE
                          Цитата amk @
                          В качестве long double используется 10-байтовое временное представление процессоров i387. Хотя некоторые компиляторы используют 128-битный формат IEEE
                          А расскажите поподробнее, а?
                            Начиная отсюда: http://ru.wikipedia.org/wiki/IEEE_754-2008 и далее по ссылкам в тексте.

                            Добавлено
                            ЕМНИП, в первоначальной версии этого стандарта таки фигурировали 80-битные числа.
                              Угу. Стандарт, конечно хорошо. Но я, в конкретном компилере имею float и double. Причом есть long double который sizeof(long double) 64.
                              А где половинная и учетверённая точность?

                              Добавлено
                              Цитата amk @
                              В десятичных константах в формате с плавающей точкой знак + после буквы e можно не писать.

                              Ну, это меня интересовало, как раз для не десятичной записи. Например шестнадцатиричной, в которой буква "e" имеет значение 14. И в этом случае, без плюсика не обойтись. "0XFFe+10"
                              Кстати, а в какой системе счисления нужно записывать порядок? В той же или десятичной?

                              Добавлено
                              Цитата simsergey @
                              А почему 2?

                              Так я и спрашивал, нужно ли что-то отнимать и если да, то сколько.
                              С форматом уже разобрался, спасибо!

                              А вот прогулявшись по описанием стандартов, так и не понял, как записывать 0, NaN и +q и -q? Я так понял, это денормализованные значения?
                                Цитата trainer @
                                ЕМНИП, в первоначальной версии этого стандарта таки фигурировали 80-битные числа.
                                Нет, частью стандарта IEEE-754 это представление никогда не было. Оно не соответствует обобщённому формату. Это фсего лишь внутреннее представление чисел в арифметическом сопроцессоре i8087. Более того, судя по ранней документации на i8087 даже инженеры Intel изначально не предполагали использовать его в качестве самостоятельного типа данных (хотя для возможности сохранения состояния процессора предусмотрели возможность его чтения/записи). Просто процессор должен был иметь возможность работать не только с плавающими числами, но и с целыми - 16/32/64 бит - и десятичными - до 20 цифр (включая знак).

                                Добавлено
                                Да, словосочетание "переполнение мантиссы" для чисел с плавающей точкой не совсем верно. В этом случае мантисса просто сдвигается на один разряд вправо (больше не надо) и к порядку добавляется единица. И вот тут может произойти переполнение порядка. Процессоры с полной реализацией арифметики IEEE выдают результат равный ±∞ (все разряды характеристики ?— единицы, все видимые разряды мантиссы — нули). Кроме того сопроцессор может сформировать при этом прерывание. Те процессоры, которые не поддерживают арифметику на таком уровне просто генерируют прерывание.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 2 [3] 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0456 ]   [ 16 queries used ]   [ Generated: 3.10.25, 10:13 GMT ]