У кого-нибудь есть объяснение этого странного округления в haskell (GHCi, версия 7.2.1). Кажется, все в порядке, если я не умножать с 100.Округление странности - что особенного о «100»?
*Main> 1.1
1.1
*Main> 1.1 *10
11.0
*Main> 1.1 *100
110.00000000000001
*Main> 1.1 *1000
1100.0
*Main> 1.1 *10000
11000.0
Edit: что puzzeling меня является то, что ошибка округления показывает только при умножении на 100.
Edit (2): Комментарии, которые я получил заставил меня понять, , что это полностью не связано с haskell, но общая проблема с числами с плавающей запятой. Многочисленные вопросы уже задавались (и отвечали) о странностях чисел с плавающей запятой, где проблема с неопределенностью типично вводила в заблуждение поплавки с действительными числами.
Perl, python, javascript и C всего сообщения 1.1 * 100.0 = 110.00000000000001
. Вот что делает C
double 10.0 * 1.1 = 11.000000000000000000000000
double 100.0 * 1.1 = 110.000000000000014210854715
double 110.0 = 110.000000000000000000000000
double 1000.0 * 1.1 = 1100.000000000000000000000000
вопрос «почему это происходит только тогда, когда умножение 100» (даже если есть четкое представление 110.0) до сих пор без ответа, но я полагаю, что нет простого ответа, другой чем полностью перешагивание с помощью умножения с плавающей запятой (спасибо Dax Fohl за то, что 10 не является чем-то особенным в двоичном коде)
Этот вопрос задан [более] (http://stackoverflow.com/questions/588004/is-javascripts-floating-point-math-broken) и [более] (http://stackoverflow.com/questions/ 7185512/why-0-10-2-0-3-5-5511151231258e-17-in-php) и [более] (http://stackoverflow.com/questions/6027937/javascript-float-subtract). –
Я думаю, что мартин спрашивает, почему это происходит в 100, но не 1000 или 10000. Сначала я нахожу это странным. Но (предположительно) причина заключается в том, что умножение на мощность -10 не просто сдвигает цифры; он проходит через некоторый бинарный множитель, и вы оказываетесь в мантиссе и экспоненте, которые она дает вам. Поскольку 10 не является чем-то особенным в двоичном коде, вы можете в конечном итоге с вещами, которые кажутся странными на первый взгляд, вот так. –
[Что каждый компьютерный ученый должен знать о арифметике с плавающей запятой] (http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf) – rampion