netch80: (Default)
netch80 ([personal profile] netch80) wrote2009-05-07 10:21 pm

Страусов не пугать - пол бетонный

4> <<P:32/big-float>> = <<63,128,0,0>>.
<<63,128,0,0>>
5> P.
1.0
6> <<P:32/big-float>> = <<127,128,0,0>>.
** exception error: no match of right hand side value <<127,128,0,0>>
7> <<P:32/big-float>> = <<127,128,0,1>>.
** exception error: no match of right hand side value <<127,128,0,1>>

в команде 6 я пытался расшифровать +INF, 7 - +NAN(1)

А вот что пишет ползучий питоний:

>>> struct.unpack('>f', '\x7f\x8f\x00\x00')[0]
nan
>>> struct.unpack('>f', '\xff\x8f\x00\xff')[0]
nan

"это не число, и к дьяволу подробности!"
Зато хоть создавать не запрещает:

>>> a = float('nan')
>>> a
nan
>>> -a
nan

и на том спасибо.
ext_605364: geg MOPO4 (Default)

[identity profile] gegmopo4.livejournal.com 2009-05-08 05:49 am (UTC)(link)
Это зависит от реализации. Даже в CPython float('nan') и float('inf') работают только если нижележащая библиотека C поддерживает.
netch: (Default)

[personal profile] netch 2009-05-08 11:10 am (UTC)(link)
> только если нижележащая библиотека C поддерживает.

А какая именно поддержка нужна для этого?
ext_605364: geg MOPO4 (Default)

[identity profile] gegmopo4.livejournal.com 2009-05-08 12:32 pm (UTC)(link)
Ну, наверное существование таких нечисел, как NAN и INFINITY, функции вроде isnan()/nan(), а может и бинарной совместимости с соответствующим IEEE. Сам питон не гарантирует их существования. На какой-то экзотической платформе может не быть.

И в 2.4 pack/unpack с ними не работал.
netch: (Default)

[personal profile] netch 2009-05-08 01:53 pm (UTC)(link)
Мне что-то кажется, что результат зависит от того, что покажет sscanf("nan", "%lg", &d)
;)
ext_605364: geg MOPO4 (Default)

[identity profile] gegmopo4.livejournal.com 2009-05-08 04:06 pm (UTC)(link)
Надо же, не знал, что scanf понимает nan. Но я с нечислами вообще дела не имел.

Тогда уж strtod, именно он используется для str->float.
ext_605364: geg MOPO4 (Default)

[identity profile] gegmopo4.livejournal.com 2009-05-08 04:12 pm (UTC)(link)
А в struct и pickle вообще используется ручная платформо-независимая упаковка в 4/8 байт. И получатся ли нечисла на не-IEEE платформе зависит от везения.