Оператор NormalizeDouble работает с ошибками? - страница 5

 
VladislavVG писал(а) >>

Все-таки дайте себе труд отделить мух от котлет.

Видите ли, способ машинного представления данных не зависит ни от языка программирования, ни от качества программирования.

А к разработчикам есть очень много обоснованных претензий, в отличие от Вашей, и они их в меру возможности рихтуют ;).

Успехов в изучении мат.части.

О машинном представлении данных простейшая ссылка в моём предыдущем комментарии. Это изученная мной по Вашей рекомендации мат. часть для Вас.

 
dokpiknik >>:

Поддерживаю .

 
dokpiknik писал(а) >>

Число 0.7 будет представлено в памяти компьютера точно в виде так называемого порядка - в нашем примере это 0 (или сдвинутого порядка) и мантиссы 7 (в двоичной форме 111). Остальные биты до конца разрядной сетки будут заполнены нулями. Другое дело, когда бесконечная дробь возникает в результате каких-нибудь операций...

Ничего подобного. Вы ошибаетесь дважды.

Во-первых, вы в своём примере умножаете 0.7 по человеческим правилам – на 10 и получаете порядок -1 (не 0, как вы написали) и мантиссу 7. Надо умножать по компьютерным правилам - на степени двойки. Для того, чтобы понять свою ошибку, попробуйте умножить 0.7 на ЛЮБУЮ степень двойки, – вы никогда не получите ЦЕЛОГО числа.

Во-вторых, в соответствии со стандартом IEEE 754 мантисса в числах с плавающей точкой всегда хранится нормализованной в диапазон [1..2). Она не может быть >= 2 или < 1. Это делается для того, чтобы не хранить старший значащий разряд мантиссы. Таким образом, числа, меньшие единицы домножаются на степени двойки, пока не попадут в этот диапазон, но остаток всё равно представляет собой бесконечную дробь. 0.7 представлено, как 1.4 * 2^(-1). Дробная часть мантиссы, – 0.4, – представляет собой в двоичной записи бесконечную дробь: 0.011001100110011...

Не верите, – попробуйте сами посчитать. Собственно, это очевидно уже исходя из моего первого утверждения.

Итак, повторю фундаментальный критерий для проверки. Если число при умножении на ЛЮБУЮ степень 2 НИКОГДА не получается целым, значит в двоичной системе это число записывается бесконечной дробью.

 
Shaitan писал(а) >>

Ничего подобного. Вы ошибаетесь дважды.

Во-первых, вы в своём примере умножаете 0.7 по человеческим правилам – на 10 и получаете порядок -1 (не 0, как вы написали) и мантиссу 7. Надо умножать по компьютерным правилам - на степени двойки. Для того, чтобы понять свою ошибку, попробуйте умножить 0.7 на ЛЮБУЮ степень двойки, – вы никогда не получите ЦЕЛОГО числа.

Во-вторых, в соответствии со стандартом IEEE 754 мантисса в числах с плавающей точкой всегда хранится нормализованной в диапазон [1..2). Она не может быть >= 2 или < 1. Это делается для того, чтобы не хранить старший значащий разряд мантиссы. Таким образом, числа, меньшие единицы домножаются на степени двойки, пока не попадут в этот диапазон, но остаток всё равно представляет собой бесконечную дробь. 0.7 представлено, как 1.4 * 2^(-1). Дробная часть мантиссы, – 0.4, – представляет собой в двоичной записи бесконечную дробь: 0.011001100110011...

Не верите, – попробуйте сами посчитать. Собственно, это очевидно уже исходя из моего первого утверждения.

Итак, повторю фундаментальный критерий для проверки. Если число при умножении на ЛЮБУЮ степень 2 НИКОГДА не получается целым, значит в двоичной системе это число записывается бесконечной дробью.

Вы правы. У меня ум за разум зашёл ... Спасибо, что дали себе труд разместить здесь подробный комментарий.