LINUX.ORG.RU

Странности perl.


0

1

Накалякал програмку для вычисления корня n-ной степени из a на перле (да, наверное не для того он, но я как раз его учу, и, кроме того, компилировать ничего не надо)

#!/usr/bin/perl

use warnings;
use strict;
use 5.010;

my $base = $ARGV[0]
        // die "Usage $0 <base> <power> <quality>\n";
my $power = $ARGV[1]
        // die "Usage $0 <base> <power> <quality>\n";
my $req_quality = $ARGV[2]
        // die "Usage $0 <base> <power> <quality>\n";

# Получаем из командной строки основание, степень  точность в качестве аргументов.

my $quality = 1;        # "Качество" - точность вычисления.
my $start = 0;          # Нижняя граница числа
my $stop = $base;       # Верхняя граница числа

while ($quality >= $req_quality) {
        #Пока точность не достигает требуемой
        while ($stop-$start >= 2*$quality) {
                $start += $quality if ($start+$quality)**$power < $base;
                $stop -= $quality if ($stop-$quality)**$power > $base;
                #Сдвигаем нижнюю и верхнюю границу числа
                #Пока не подберемся вплотную к значению радикала,
        }
        print "start = $start, stop = $stop, stop - start =", $stop-$start, "\n";
        $quality /= 10;
        #Увеличиваем точность;
}

my $result = ($start + $stop)/2;

say "Result: $result in the power of $power equals ", $result**$power;
#Печатаем результат и одновременно с этим проверяем, что получилось;

Все бы хорошо, кроме этой строчки:

while ($stop-$start >= 2*$quality)
Мне пришлось сделать так, а не так:
while ($stop-$start > $quality)
поскольку, перл как-то странно считает разность. Я специально добавил print после каждого подсчета, чтобы продемонстрировать это:
$ ./radical.pl 5 70 0.000000001
start = 1, stop = 2, stop - start =1
start = 1, stop = 1.2, stop - start =0.199999999999999
start = 1.02, stop = 1.04, stop - start =0.0199999999999991
start = 1.023, stop = 1.024, stop - start =0.00100000000000122
start = 1.0232, stop = 1.0233, stop - start =0.000100000000001321
start = 1.02325, stop = 1.02326, stop - start =1.00000000007316e-05
start = 1.023258, stop = 1.023259, stop - start =1.00000000147205e-06
start = 1.0232583, stop = 1.0232584, stop - start =1.00000000946565e-07
start = 1.02325832, stop = 1.02325833, stop - start =1.00000014935375e-08
start = 1.023258322, stop = 1.023258323, stop - start =1.00000074887419e-09
Result: 1.0232583225 in the power of 70 equals 4.99999985235406
В чем дело? Почему 1.04 - 1.02 == 0.0199999999999991?



Последнее исправление: IceAlchemist (всего исправлений: 1)

Ответ на: комментарий от baverman

написано, что перл может распознать (и сохранить во внутреннем представлении) числа любой точности, но [стандартные] операции над ними порежут эту точность.

всё верно написано. но модули подменяют/расширяют стандартные операции:

$ perl -Mbignum -E 'say 1000000000000000000000000000000000000000000000000000000000000 - 1'
999999999999999999999999999999999999999999999999999999999999
$ _
arsi ★★★★★
()
Ответ на: комментарий от baverman

Вообще-то я прочитал про «decimal strings», или у них проблемы с приведением на арифметике?

Это одно из трёх внутренних представлений чисел. Не более. Если ты приводишь 0.999999999999 к int и получаешь 1, считаешь ли ты это «проблемой с приведением»?

В perl уже всё давно заточено!

helios ★★★★★
()
Ответ на: комментарий от helios

Даже модуль для рациональных дробей где-то валялся ^__^

Интересно, зачем все это если Perl изначально больше для текстовых строк предназначен?

IceAlchemist
() автор топика
Ответ на: комментарий от IceAlchemist

Интересно, зачем все это если Perl изначально больше для текстовых строк предназначен?

Чего только не напилишь за четверть века :)

helios ★★★★★
()
Ответ на: комментарий от IceAlchemist

Хотя, наверное, для математики лучше что-то компилируемое.

Чтобы собрать из него XS модуль для Perl :)

helios ★★★★★
()
Ответ на: комментарий от arsi

Чтобы собрать из него XS модуль для Perl :)

Хихик, и что, быстро работает? А то так действительно можно договориться до того, что другие языки нужны только чтобы писать перловые модули...

блин, пора спать :))

Спать - это полезно!

IceAlchemist
() автор топика
Ответ на: комментарий от helios

С чем будем сравнивать?

Даже не смешно. Древнейший easy_install и то больше может. Не говоря уже о современной связке pip + virtualenv.

baverman ★★★
()
Ответ на: комментарий от baverman

И что, даже так умеет:

cpan[2]> i /kraih/
Going to read '/home/gosha/.cpan/Metadata'
  Database was generated on Wed, 22 Feb 2012 03:13:38 GMT
Author id = KRAIH
    EMAIL        kraih@cpan.org
    FULLNAME     Sebastian Riedel

Да, мне следовало привести ссылку на эту страницу: http://search.cpan.org/~andk/CPAN-1.9800/lib/CPAN.pm Но мне сначала хотелось узнать: а как в других менеджерах происходит поиск?

helios ★★★★★
()
Ответ на: комментарий от helios

Если ты ничего не знаешь про инфраструктуры пакетов питона или руби, лучше сразу так и скажи, а то размахивание заскорузлой морковкой выглядят довольно-таки комично.

baverman ★★★
()
Ответ на: комментарий от helios

Например:

- Как деинсталировать пакет?
- Как воспроизвести пакетное окружение на другой машине?
- Как зааплоадить пакет и документацию?
- Как управлять виртуальными окружениями (в каждом могут быть свои версии пакетов)?
- Как поставить пакет из vcs?

baverman ★★★
()
Ответ на: комментарий от baverman

Вы не привели ни одной ссылки, что печально. А я ведь хотел, так хотел, ты веришь? Хотел разобраться с пакетными менеджерами других языков! Но нет, всё тлен...

Будь проще и улыбайся!

Но мне сначала хотелось узнать: а как в других менеджерах происходит поиск?

Вас это не навело на мысль, что я не разбираюсь в тонкостях пакетных менеджеров этих языков и ищу возможности пополнить свой запас знаний?

helios ★★★★★
()
Ответ на: комментарий от helios

ищу возможности пополнить свой запас знаний?

Вот это сильно навряд-ли. Большинству перлистов, кроме перла другой динамический ЯП не нужен, и даже слышать о таком не хотят.

baverman ★★★
()
Ответ на: комментарий от baverman

Вот это сильно навряд-ли. Большинству перлистов, кроме перла другой динамический ЯП не нужен, и даже слышать о таком не хотят.

Я же не собираюсь перейти на другой язык. Мне просто интересно. Может припилю недостающие фичи... Если они реально классные.

helios ★★★★★
()
Ответ на: комментарий от baverman

- Как деинсталировать пакет?

cpanplus умеет

- Как воспроизвести пакетное окружение на другой машине?

cpan СПИСОК_НУЖНЫХ_МОДУЛЕЙ - или я не понял?

- Как зааплоадить пакет и документацию?

То есть на cpan? Ну тут есть варианты. Если на сам cpan, то надо стать cpan-автором и получить доступ. Если через metacpan - зарегистрироваться там и он будет собирать пакеты с того же github'а. А документация обычно встроена в модуль.

- Как управлять виртуальными окружениями (в каждом могут быть свои версии пакетов)?

Разные $PERLENV

- Как поставить пакет из vcs?

Можно из архива, можно через metacpan, а можно по-рабоче-крестьянски perl Makefile.PL && make && make test && sudo make install

helios ★★★★★
()
Ответ на: комментарий от IceAlchemist

IceAlchemist

Но это это, блин, было и правда неожиданно..

угу. а ещё сравнивать нельзя. ВНЕЗАПНО 1/5 != 0.2 ты-то в десятичной системе считаешь, а комп в двоичной, для него 1/5 это типа как для тебя 1/3 - не записывается конечным числом цифирь. И язык тут не причём.

drBatty ★★
()

компилировать ничего не надо

компиляция происходит при каждом запуске скрипта

по сабжу:

вот и выросло поколение программистов, не слушавших элементарный курс вычислительной математики...

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от IceAlchemist

Например bioperl - самый популярный язык для биоинформатики, так что с «больше для текстовых строк предназначен» ты немного не прав.

bjorn
()
Ответ на: комментарий от bjorn

компиляция происходит при каждом запуске скрипта

Ну к чему это занудство? Прекрасно понятно, что я имел в виду. Чтобы написать программу на C нужен как минимум компилятор, а перл уже есть, к тому же скрипты отлаживать проще.

вот и выросло поколение программистов...

Я не программист. Просто интересующийся.

Например bioperl - самый популярный язык для биоинформатики, так что с «больше для текстовых строк предназначен» ты немного не прав.

Хм, ну я уже понял что сейчас на нем все что угодно можно делать - было бы желание. Ну, наверное низкоуровневую всякую ерунду не очень попишешь...

IceAlchemist
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.