Извините, я не совсем правильный привел пример. Вот правильный.
Функция atof преобразует строку в значение типа double.
В моем алгоритме решается следующая задача. Имеется, допустим, двоичное число (float) y=1.00100111100111010011100*2^-21, значение которого равно десятичному представимому числу x=5.50624235984287224709987640380859375E-7. Надо правильно округлить это число до N (произвольных) десятичных значащих цифр и представить полученное число в нормализованном двоичном коде. Например, для N=7, наше округленное число будет равно Xr=5.506242e-7. Его двоичный эквивалент равен y=1.00100111100111010011011*2^-21. Значение этого числа равно десятичному представимому числу X=5,5062417914086836390197277069092e-7E-7, которое является ближайшим к правильно округленному числу Xr. Заметьте, что x≠X.
Функция atof преобразует строку в значение типа double.
В моем алгоритме решается следующая задача. Имеется, допустим, двоичное число (float) y=1.00100111100111010011011*2^-21, значение которого равно десятичному представимому числу x=4.7731452512794022565370082855225e-7. Надо правильно округлить это число до N (произвольных) десятичных значащих цифр и представить полученное число в нормализованном двоичном коде. Например, для N=7, наше округленное число будет равно Xr=4.773145e-7. Его двоичный эквивалент равен y=1.00000000010000011001101e-21. Значение этого числа равно десятичному представимому числу X=4.77314472391299204900860786438E-7, которое является ближайшим к правильно округленному числу Xr.
В статье написано.
«Сравним основные свойства чисел с плавающей точкой, которые представлены в стандарте IEEE754 и СДДФ. Для простоты рассмотрим 16-разрядное машинное слово. Это так называемый формат половинной точности.» Это преамбула для сравнения половинного формата IEEE754 c СДДФ, закодированном в 16 разрядном машинном коде. Дале с 1 по 12 раздел сравниваются представления чисел только для указанных форматов. В заключение указаны основные свойства чисел представленных в формате сингл IEEE и СДДФ с 32 разрядным машинным словом. Какие уточнения еще требуются?
Вы говорите про математику, но почему-то называете её арифметикой.
Арифметика — это подраздел математики. Компьютерная арифметика — это подраздел классической арифметики. Я говорю о компьютерной арифметике, используя понятия классической арифметики.
При чём здесь вообще математика или арифметика
Действительно, если читать только комментарии отдельных авторов, то математики и арифметики в них можно и не найти.
Вам указали на вполне конкретный недостаток статьи, а именно, полное отсутствие уточнений, о какой именно из разновидностей СДДФ идёт речь в каждом конкретном случае,
А можно примеры этих случаев? Где в статье рассматриваются «разновидности СДДФ», без уточнений, конкретных примеров или где в наличии двусмысленности. Я поправлю.
Хоть это и не касается темы моей статьи, не могу, в очередной раз, не возразить вам.
Осмелюсь замахнуться, страшно сказать, на самого Дэвида Голдберга, и ужаснее всего, на его хрестоматийную статью "What Every Computer Scientist Should Know About Floating-Point Arithmetic". В котрой в частности в разделе Base говорится: Consider the computation of 15/8. When b = 2, 15 is represented as 1.111 × 2^3, and 15/8 as 1.111 × 2^0. So 15/8 is exact. However, when = 16, 15 is represented as F × 16^0, where F is the hexadecimal digit for 15. But 15/8 is represented as 1 × 16^0, which has only one bit correct. In general, base 16 can lose up to 3 bits, so that a precision of p hexadecimal digits can have an effective precision as low as 4p — 3 rather than 4p binary bits. Since large values of b have these problems, why did IBM choose b= 16 for its system/370? Only IBM knows for sure..."
Только не давите на меня своими столпами. Найдете ошибку сообщите.
Но Голдберг здесь делает ту же ошибку, что и вы. Если оперировать не форматами а машинным словом, то для двоичных чисел выбрано двоичное слово: 4-мантисса, 2-экспонента итого 4+2=6 разрядов. А для 16-ричного представления он почему-то оставляет только 4 разряда. На самом деле, если 15=F (4 разряда), 8=8 (1 разряд) то для десятичных чисел 15/8=1.875, что в 16-ричном и двоичном виде равно F/8= 1.E*16^0=1.111. Данное число представляется также как и двоичное, 6-ю разрядным словом. Только 1 разряд — экспонента, 5 разрядов мантисса. В нашем случае даже 4 разряда, поскольку E в дроби, а для F потребуется еще один. Более того, если в двоичном виде число 1.111*2^3=15, то для 16-тиричных чисел с 6-разрядным словом максимальное число будет 1.F*16^1=31. Ну и где здесь потеря точности?
В обсуждаемой статье рассматривается реализация десятичной арифметики инструментарием двоичной. Преимущества и недостатки той или иной системы не есть предмет обсуждения расматриваемой статьи. Что касается десятичной арифметики, наиболее подробно можно почитать в статье одного из основных разработчиков десятичной арифметики для станадрта IEEE754-2008 Майка Коулишева (Mike Cowlishaw) General Decimal Arithmetic.
Если в статье имеются ошибки, неточности, некорректно сформулированные утверждения, и вы на них укажете, почему вы считаете, что я не буду благодарен. Очень даже буду. Но если вы ругаете статью только за то, что она не соответствует вашим представлениям, без анализа вышеперечисленных факторов, то да, спасибо не скажу. Арифметика -наука точная. Доказательства в ней ведутся с помощью оперирования числами, а не общими рассуждениями.
Формат двоичных чисел с фиксированной точкой может быть реализован в 16,32,64 разрядном машинном слове. СДДФ также может быть реализован в словах различной разрядности. Пока он не попадает ни под какие стандарты.
Если вы не доверяете вычислителю, у вас имеются другие варианты проверки результата?.. Странно пользоваться вычислителем для серьезных эадач, который на простых примерах дает неверный результат.
Прошу в личку.
Нам известно, что вычислитель — двоичный (это тоже условие задачи).
Вам известно, а мне не известно. Для десятичных чисел используется десятичны вычислитель, независимо от того, как он реализован. Для двоичных чисел используется двоичный вычислитель. Для обоих случаев ошибок представления нет.
Извините, мне трудно разобраться с текстом, где в цитаты оппонента вставляются свои, как вам кажется правильные слова. За неимением времени, если вы хотите разобраться с вопросом, а не доказать любыми способами, что автор верблюд, прошу в личку.
Там вообще ничего про системы счисления не сказано. Там сказано, в вольном переводе, что чем объект ближе к своему номинальному значению, тем он более точен. В нашем случае, чем двоичное число более близко по своему значению к своему номинальному значению, а в нашем случае это десятичное число, тем оно более точно представляет это десятичное число.
Функция atof преобразует строку в значение типа double.
В моем алгоритме решается следующая задача. Имеется, допустим, двоичное число (float) y=1.00100111100111010011100*2^-21, значение которого равно десятичному представимому числу x=5.50624235984287224709987640380859375E-7. Надо правильно округлить это число до N (произвольных) десятичных значащих цифр и представить полученное число в нормализованном двоичном коде. Например, для N=7, наше округленное число будет равно Xr=5.506242e-7. Его двоичный эквивалент равен y=1.00100111100111010011011*2^-21. Значение этого числа равно десятичному представимому числу X=5,5062417914086836390197277069092e-7E-7, которое является ближайшим к правильно округленному числу Xr. Заметьте, что x≠X.
В моем алгоритме решается следующая задача. Имеется, допустим, двоичное число (float) y=1.00100111100111010011011*2^-21, значение которого равно десятичному представимому числу x=4.7731452512794022565370082855225e-7. Надо правильно округлить это число до N (произвольных) десятичных значащих цифр и представить полученное число в нормализованном двоичном коде. Например, для N=7, наше округленное число будет равно Xr=4.773145e-7. Его двоичный эквивалент равен y=1.00000000010000011001101e-21. Значение этого числа равно десятичному представимому числу X=4.77314472391299204900860786438E-7, которое является ближайшим к правильно округленному числу Xr.
«Сравним основные свойства чисел с плавающей точкой, которые представлены в стандарте IEEE754 и СДДФ. Для простоты рассмотрим 16-разрядное машинное слово. Это так называемый формат половинной точности.» Это преамбула для сравнения половинного формата IEEE754 c СДДФ, закодированном в 16 разрядном машинном коде. Дале с 1 по 12 раздел сравниваются представления чисел только для указанных форматов. В заключение указаны основные свойства чисел представленных в формате сингл IEEE и СДДФ с 32 разрядным машинным словом. Какие уточнения еще требуются?
Арифметика — это подраздел математики. Компьютерная арифметика — это подраздел классической арифметики. Я говорю о компьютерной арифметике, используя понятия классической арифметики.
Действительно, если читать только комментарии отдельных авторов, то математики и арифметики в них можно и не найти.
А можно примеры этих случаев? Где в статье рассматриваются «разновидности СДДФ», без уточнений, конкретных примеров или где в наличии двусмысленности. Я поправлю.
Осмелюсь замахнуться, страшно сказать, на самого Дэвида Голдберга, и ужаснее всего, на его хрестоматийную статью "What Every Computer Scientist Should Know About Floating-Point Arithmetic". В котрой в частности в разделе Base говорится: Consider the computation of 15/8. When b = 2, 15 is represented as 1.111 × 2^3, and 15/8 as 1.111 × 2^0. So 15/8 is exact. However, when = 16, 15 is represented as F × 16^0, where F is the hexadecimal digit for 15. But 15/8 is represented as 1 × 16^0, which has only one bit correct. In general, base 16 can lose up to 3 bits, so that a precision of p hexadecimal digits can have an effective precision as low as 4p — 3 rather than 4p binary bits. Since large values of b have these problems, why did IBM choose b= 16 for its system/370? Only IBM knows for sure..."
Только не давите на меня своими столпами. Найдете ошибку сообщите.
Но Голдберг здесь делает ту же ошибку, что и вы. Если оперировать не форматами а машинным словом, то для двоичных чисел выбрано двоичное слово: 4-мантисса, 2-экспонента итого 4+2=6 разрядов. А для 16-ричного представления он почему-то оставляет только 4 разряда. На самом деле, если 15=F (4 разряда), 8=8 (1 разряд) то для десятичных чисел 15/8=1.875, что в 16-ричном и двоичном виде равно F/8= 1.E*16^0=1.111. Данное число представляется также как и двоичное, 6-ю разрядным словом. Только 1 разряд — экспонента, 5 разрядов мантисса. В нашем случае даже 4 разряда, поскольку E в дроби, а для F потребуется еще один. Более того, если в двоичном виде число 1.111*2^3=15, то для 16-тиричных чисел с 6-разрядным словом максимальное число будет 1.F*16^1=31. Ну и где здесь потеря точности?
Прошу в личку.
А мы разве где-то обсуждали условия задачи? Я все время говорил про инструмент.
А я где-то утверждал обратное?
Хотите истины, прошу в личку.
Вам известно, а мне не известно. Для десятичных чисел используется десятичны вычислитель, независимо от того, как он реализован. Для двоичных чисел используется двоичный вычислитель. Для обоих случаев ошибок представления нет.
У меня складывается впечатление, что вы читаете не то, что написано, а то, что хотите видеть в написаном.
К СДДФ это не имеет никакого отношения
Правильно, кто-то меряет в попугаях и его это вполне устраивает