Нет, не разбито, но большинство десятичных дробей должно быть приблизительно
Краткое описание
Арифметика с плавающей точкой является точной, к сожалению, она не очень хорошо согласуется с нашим обычным представлением чисел с основанием 10, поэтому оказывается, что мы часто даем ей ввод, который немного отличается от того, что мы написал.
Даже простые числа, такие как 0,01, 0,02, 0,03, 0,04 ... 0,24, не могут быть представлены в виде двоичных дробей. Если вы подсчитаете 0,01, 0,02, 0,03 ..., то только до 0,25 вы получите первую дробь, представленную в базе 2 . Если вы попробуете это с использованием FP, ваш 0.01 был бы немного не таким, так что единственный способ добавить 25 из них до точного 0.25 потребовал бы длинной цепочки причинно-следственных связей, включая защитные биты и округление. Трудно предсказать, поэтому мы вскидываем руки и говорим "FP - это неточно", но это не совсем так.
Мы постоянно даем оборудованию FP что-то, что кажется простым в базе 10, но является повторяющейся дробью в базе 2.
Как это случилось?
Когда мы пишем в десятичном виде, каждая дробь (в частности, каждая оканчивающаяся десятичная дробь) является рациональным числом вида
a / (2 n x 5 m )
В двоичном коде мы получаем только 2 n термин, то есть:
a / 2 n
Итак, в десятичном виде мы не можем представить 1 / 3 . Поскольку основание 10 включает 2 в качестве простого множителя, каждое число, которое мы можем записать в виде двоичной дроби, также можно записать в виде дробной базы 10. Однако вряд ли что-либо, что мы пишем как базовую дробь 10 , представимо в двоичном виде. В диапазоне от 0,01, 0,02, 0,03 до 0,99 в нашем формате FP могут быть представлены только три числа: 0,25, 0,50 и 0,75, поскольку они равны 1/4, 1/2 и 3/4, все числа с простым множителем используют только член 2 n .
В базе 10 мы не можем представить 1 / 3 . Но в двоичном коде мы не можем сделать 1 / 10 или 1 / 3 .
Таким образом, хотя каждая двоичная дробь может быть записана в десятичном виде, обратное неверно. И фактически большинство десятичных дробей повторяется в двоичном формате.
Работа с ним
Разработчикам, как правило, поручается делать сравнения, лучше советовать округлять до целых значений (в библиотеке C: round () и roundf (), т. Е. Оставаться в формате FP). а потом сравни. Округление до определенной длины десятичной дроби решает большинство проблем с выводом.
Кроме того, о реальных проблемах с сокращением чисел (проблемы, которые были изобретены FP на ранних, ужасно дорогих компьютерах), физические константы вселенной и все другие измерения известны только относительно небольшому числу значимых цифр, поэтому все проблемное пространство было "неточным" в любом случае. «Точность» FP не является проблемой для такого рода приложений.
Вся проблема действительно возникает, когда люди пытаются использовать FP для подсчета бобов. Это работает для этого, но только если вы придерживаетесь целочисленных значений, что лишает смысла использовать его. Вот почему у нас есть все эти библиотеки программного обеспечения с десятичной дробью.
Мне нравится ответ «Пицца» Крис , потому что он описывает реальную проблему, а не просто обычные пометки о «неточности». Если бы FP были просто «неточными», мы могли бы исправить это и сделали бы это десятилетия назад. Причина, по которой мы этого не делаем, заключается в том, что формат FP компактен и быстр, и это лучший способ сократить множество чисел. Кроме того, это наследие космической эры и гонки вооружений и ранних попыток решить большие проблемы с очень медленными компьютерами с использованием небольших систем памяти. (Иногда отдельные магнитные ядра для 1-битного хранилища, но это другая история. )
Заключение
Если вы просто подсчитываете бины в банке, программные решения, которые в первую очередь используют десятичные строковые представления, работают превосходно. Но вы не можете делать квантовую хромодинамику или аэродинамику таким образом.