[Moscow.pm] Целочисленная бесконечность
Oleg Alistratov
ali на ali.org.ua
Чт Дек 13 02:32:41 PST 2012
О, спасибо за цынк.
Думаю, напишу свой int(), как водится — с преферансом и гимназистками.
13.12.2012, 12:26, "Vladimir Timofeev" <vovkasm на gmail.com>:
> 2012/12/13 Oleg Alistratov <ali на ali.org.ua>:
>
>> Мда. Это у меня мелкие претензии. Дело не в inf и nan.
>> Вообще любой литерал, который не влазит в IV, создает NV.
>
> Там даже коммент на эту тему в коде pp.c (5.16.1):
> /* XXX it's arguable that compiler casting to IV might be subtly
> different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
> else preferring IV has introduced a subtle behaviour change bug. OTOH
> relying on floating point to be accurate is a bug. */
>
> и дальше, если не SvIOK:
> const NV value = SvNV_nomg(sv);
> if (value >= 0.0) {
> if (value < (NV)UV_MAX + 0.5) {
> SETu(U_V(value));
> } else {
> SETn(Perl_floor(value));
> }
> }
> else {
> if (value > (NV)IV_MIN - 0.5) {
> SETi(I_V(value));
> } else {
> SETn(Perl_ceil(value));
> }
> }
>
>> Так что в perldoc -f int написана не вся правда :)
>>
>> 13.12.2012, 11:46, "Oleg Alistratov" <ali на ali.org.ua>:
>>> Внезапно:
>>>
>>> % perl -e 'print int("Inf"), "\n";'
>>> inf
>>>
>>> Чудес там, конечно, нет, возвращается NV:
>>>
>>> % perl -mDevel::Peek -e '$a = int("Inf"); print Devel::Peek::Dump($a), "\n";'
>>> SV = NV(0x7f9cf1830e00) at 0x7f9cf18290e8
>>> REFCNT = 1
>>> FLAGS = (NOK,pNOK)
>>> NV = inf
>>>
>>> но получается, что функции int() нельзя доверять в плане возвращения целых чисел.
>>> Кто-нибудь знает, откуда растет это явление?
>>>
>>> --
>>> Oleg Alistratov
>> --
>> Oleg Alistratov
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>
> --
> Vladimir Timofeev <vovkasm на gmail.com>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
--
Oleg Alistratov
Подробная информация о списке рассылки Moscow-pm