2010-01-13 2 views
2

Я столкнулся с странным поведением в Perl. Следующее вычитание должно дать ноль в качестве результата (что он делает в Python):Означает ли научная нотация точность Perl?

print 7.6178E-01 - 0.76178 
-1.11022302462516e-16 

Почему это происходит и как этого избежать?

P.S. Эффект появляется на «v5.10.0, построенном для x86_64-linux-gnu-thread-multi» (Ubuntu 9.04) и «v5.8.9 для darwin-2level» (Mac OS 10.6)

+0

Работает отлично для меня, я получаю 0 (v5.8.8, Mac OSX). –

+1

У меня на этом компьютере есть два Perls - локальная сборка 5.8.8, которая работает правильно, и тот, который встроен, - который показывает вашу проблему. –

+0

Происходит на 5.10.1, MSWin32-x86-многопоточное (Strawberry Perl 5.10.1.0). –

ответ

8

Это не то, что научная нотация влияет на так же, как ограничения нотации с плавающей запятой, представленные в двоичном формате. См. Ответы на perlfaq4. Это проблема для любого языка, который опирается на базовую архитектуру для хранения номеров.

Если вам нужно больше обработки номер, проверьте bignum прагму.

+0

Хорошо, использовать bignum делает трюк. Тем не менее, я отказываюсь воспринимать это поведение как обычно, независимо от каких-либо проблем с двоичным представлением. Любой другой язык справляется с этим правильно. – Simon

+0

Не все языки хранят номера одинаково, и я ничего не говорил о том, что это нормально. –

+2

Simon - любой язык, который не демонстрирует подобные проблемы, по крайней мере в НЕКОТОРЫХ случаях в углу, либо не использует инструкции с плавающей запятой CPU, либо неправильно обрабатывает числа с плавающей запятой. К сожалению, некорректная обработка чисел относительно нормальна (при прокатах в пересчете на дробные числа базы-10 и числа с плавающей запятой). – Vatine

Смежные вопросы