Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> неправильные вычисления с плавающей точкой, Ошибки в вычислении значения 
V
    Опции темы
XoRe
Дата 18.2.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



Скрипт:
------------------------------
#!/usr/bin/perl

$a = 601; foreach $b (0..9) { $c = $a + $b / 10; print "$c: " . (($c * 100) - ($c * 10 * 10)) . "\n"; }
------------------------------

Выдает:
601: 0
601.1: 0
601.2: 7.27595761418343e-12
601.3: -7.27595761418343e-12
601.4: 0
601.5: 0
601.6: 0
601.7: 7.27595761418343e-12
601.8: -7.27595761418343e-12
601.9: 0

Вопрос:
Почему???

Проверялось на разных машинах с конфигурациями:
Perl 5.8.8/FreeBSD 7.0;
Perl 5.8.8/Linux gentoo (kernel 2.6.20-gentoo-r8);
Perl 5.8.8/Linux gentoo (kernel 2.4.32-gentoo-r7);
Perl 5.10.0/Linux Ubuntu 8.10 (kernel2.6.27-12-generic);
PM MAIL   Вверх
ginnie
Дата 18.2.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



XoRe, с десятичными дробями часто возникают проблемы при вычислениях из-за невозможности их точного представления в виде двоичных чисел ограниченной разрядности.

Код

perl -e '$a = 601; foreach $b (0..9) { $c = $a + $b / 10; printf "$c: %.30f %.30f$/", $c*100, $c*10*10; }'


Меня кое-что удивило в Вашем примере: я думал, что оптимизатор заменит 10*10 на 100 (тогда указанное Вами поведение интерпретатора Perl было бы странным), но он этого не делает

Код

perl -MO=Deparse -e '$test * 10 * 10'


сравните с

Код

perl -MO=Deparse -e '$test + 10 * 10'


в случае сложения, вычисление суммы оптимизатор также не выполняет

Код

perl -MO=Deparse -e '$test + 10 + 10'


Кто-нибудь знает, почему оптимизатор так работает?

Это сообщение отредактировал(а) ginnie - 18.2.2009, 18:59


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
sir_nuf_nuf
Дата 18.2.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



ginnie, ассоциативность левая..
сравни с 
Код

perl -MO=Deparse -e '$test + (10 + 10)'



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
ginnie
Дата 18.2.2009, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



sir_nuf_nuf, спасибо за пояснение, что-то оптимизатор не радует своим "интеллектом"  smile 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
XoRe
Дата 19.2.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



Сказываются пробелы в образовании.
Спасибо за информацию)

http://rt.perl.org/rt3/Public/Bug/Display.html?id=63304
Проблему можно считать решенной )

Это сообщение отредактировал(а) XoRe - 19.2.2009, 13:05
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.