[Moscow.pm] Целочисленная бесконечность
Vladimir Timofeev
vovkasm на gmail.com
Чт Дек 13 02:25:39 PST 2012
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