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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перл производит вычисления, как-то странно 
:(
    Опции темы
Гость_Сергей
Дата 25.4.2005, 15:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











вот простенький скрипт
#!/usr/bin/perl
print "Content-type: text/html; charset=koi8-r\n\n";
for ($i=0.6; $i<=1.6; $i+=0.001) {
print "$i<br>\n";
}
ничего вроде сложного, должен столбец выводиться
0.6
0.601
0.602
...
1.6

но начиная гдето со значения 1.4 выдаёт
1.3999999999
1.4009999999
и т. д.

может это у меня только так?
и почему это так получается?
  Вверх
korob2001
Дата 25.4.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Код

#!/usr/bin/perl
print "Content-type: text/html; charset=koi8-r\n\n";
for ($i=0.6; $i<=1.6; $i+=0.001) {
printf("%.3f<br>\n", $i);
}



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kiber_rat
Дата 25.4.2005, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

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



Забавно, я немного переделал твой код и у меня получился правильный вывод, а твой действительно странно себя ведет... В любом случае можно в таких случаях использовать printf или sprinf
Вот мой код:
Код

#!/usr/bin/perl -w
print "Content-type: text/html; charset=koi8-r\n\n";
print $_/1000+0.001."<br>\n" for (600..1599);



--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
Гость_Сергей
Дата 25.4.2005, 17:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











а почему же так получается?
может кто из знающих подскажет?
  Вверх
Kiber_rat
Дата 26.4.2005, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

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



Вот порасспросил знакомого "гуру" smile Привожу цитату:
Цитата
Я-ж говорю - патамучта дроби. Подумай сам: дробей бесконечное кол-во, согласен?
А битов/байтов, которыми нужно задать любое число - конечное. Поэтому некоторые
(многие smile) дробные числа вообще не имеют представления на компе и округляются
в какую-нить сторону.
И чем больше ты с ними работаешь - тем больше погрешность накапливается.
Лечится это несколькими способами:
- работать только с целыми числами (т.е. умножить на коэффициент) а перед
  выводом разделить чтобы получить нужные числа
- работать с тектовыми представлениями чисел - очень медленно и неудобно, но
  100% точность
- использовать модули Math::* которые работают а-ля в тектовом виде, но
  написаны оптимизировано на C
Ну и т.д. Идея, я думаю, понятна. smile



--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
korob2001
Дата 26.4.2005, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Причем это проблема не только в Perl, но и в других языках.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Ivan Kolesnikov
Дата 26.4.2005, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

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



В десятичной системе
1.2 = 1*10^1 + 2*10^(-1)
Можно заметить:
0.2 = 1/5 или приблеженно равно = 1/8 + 1/16 + 1/128 = 25/128 = 0.1953125
Точного представления все равно не получится, потому что нет такого числа что (2^x) % 5 = 0
И получаем в двоичной системе
1*2^0+0*2^(-1)+0*2^(-2)+1*2^(-3)+1*2^(-4)+0*2^(-5)+0*2^(-6)+1*2^(-7)+... = 1.0011001...

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


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

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


 




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


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

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