| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Ошибка округления |
| Автор: wladk 25.11.2005, 00:44 | ||||
Без долгих рассуждений - есть код:
Насколько я помню математику 4-го класса, от перемены мест множителей произведение не меняется. Данный скрипт иллюстрирует, что у перла на это свое мнение. (результат работы приведенного выше скрипта)
Я понимаю, что проблемма связана с представлением чисел с плавающей запятой в компьютере. Но все же, что же делать то? Есть идеи? |
| Автор: Kiber_rat 25.11.2005, 01:17 |
| Я бы попробовал заюзать какой нить математический модуль... http://search.cpan.org/~tels/Math-BigInt-1.77/lib/Math/BigFloat.pm к примеру. А по простому - используй целочисленную математику., т.е. перед тем как использовать операнды, умножь их на 10000 (что бы все стали целыми) а потом результат - раздели на те же 10000 |
| Автор: Uhuhu 25.11.2005, 20:17 |
| Перл округляет числа не по привычной математической схеме (до пяти сотых - меньше, после - больше), а по привычной для программистов схеме (и более удобной?): к четному числу. Читайте спецификацию языка |
| Автор: wladk 26.11.2005, 01:19 | ||||||
1. Для програмиста много чего привычно и удобно 2, Если вы внимательно посмотрите на данные, то увидите, что в одном случае округлестя к четному 949762.48, а другой раз к не четному 949762.48. Вот в эотом то был вопрос.... в зависимости результат от порядка следования операндов...
ссылочку будьте добры. А то у меня в башку вот засело, хоть ты тресни
Что в принципе соотносится с данными в предидущем примере.... А вы случайно не спутали с функцией Round, модуля Math::BigFloat, вот у нее таки да, такой характер.... |
| Автор: Guest 26.11.2005, 01:23 | ||
Спасибо за идею.... ВОт идея с челочисленной математикой мне понравилась... Только наверное и хранить так надо.... а при выводе делить. Только не 10000, а на кол-во множителей*10000:) А моножителей может быть дофигища...... Все равно спасибо! Вывел меня из ступора!:))) |
| Автор: Usya 26.11.2005, 06:24 | ||||
А что здесь поделаешь??? Ничего... Perl все правильно сделал. Я тебе могу кучу примеров привести, где от перестановки может координально поменяться ответ. Да и в учебниках есть соответствующие примеры об этом... И округлил Perl результаты правильно. На счет умножения на 10000 - может подойти в 99% случаев. Все зависит от того, сколько и какие арифметические операции ты выполняешь, нужно ли сохранять промежуточные округленные данные с последующим использованием и с какой точностью они сохранены, а то там может начать давать о себе знать погрешность округлений. На счет идей - попробуй перед тем, как выводить результат в приведенном коде, прибавить к нему, например, 0.0000000001 - мелочь, а приятно. И будет Вам счастье P/s
Почитай про абсолютную погрешность и ты сам сможешь ее оценить. А то может эта погрешность оказаться больше твоего результата со всеми вытекающими последствиями |