Глюки ужас достали
Давно начал замечать, что после сериализации числа херятся. Происходит редко.
Сделал тестовый код
Где $c - случайное число, а $x - прошедшее сериализацию (упаковку и распаковку). Если запускать раз 100 скрипт может получится такой результат:
или еще запуск:
(глюки, где большой diff)
При обычных запусках вылезают сообщения с небольшими отклонениями (в 8-м знаке, типа diff=0.125). При случайном запуске - полная херь. Воспроизвести гарантироавнно не удается, вылезает случайно, но стабильно.
Если взять любое глючное число и выполнить
то глюка уже нет.
Давно начал замечать, что после сериализации числа херятся. Происходит редко.
Сделал тестовый код
Код:
[size=-1]<?
for ($i=0; $i<10000; $i++) {
$a=mt_rand(1,127*256*256*256);
$b=mt_rand(1,256*256*256);
$c=-$a/$b;
$buf=serialize($c);
$x=unserialize($buf);
if (abs($x-$c)>0.01)
echo "<li>a=$a; b=$b; c=$c; c=".sprintf("%.50f",$c)."; buf=$buf; x=$x; diff=".($x-$c)."\r\n\r\n";
}
?>[/size]
Код:
[size=-1]
a=1324501242; b=3426882; c=-386.50331175687; c=-386.5033117568681859665957745164632797241211; buf=d:-386.50331175686818596659577451646327972412109375;; x=-620757122.50331; diff=-620756736
a=1384839212; b=14044929; c=-98.600655937812; c=-98.6006559378121494319202611222863197326660; buf=d:-98.600655937812149431920261122286319732666015625;; x=-166985762.60066; diff=-166985664
a=1502349875; b=8725; c=-172189.0974212; c=-172189.0974212034489028155803680419921875000000; buf=d:-172189.0974212034489028155803680419921875;; x=-172189.0349212; diff=0.062500000058208
a=2108147252; b=10055686; c=-209.647283338; c=-209.6472833380040015072154346853494644165039; buf=d:-209.64728333800400150721543468534946441650390625;; x=-4.3962989781031E+017; diff=-4.3962989781031E+017
a=2013293164; b=38624; c=-52125.44438691; c=-52125.4443869096940034069120883941650390625000; buf=d:-52125.4443869096940034069120883941650390625;; x=-52125.42876191; diff=0.015625000007276
a=660690100; b=3456214; c=-191.16006705603; c=-191.1600670560330001990223536267876625061035; buf=d:-191.160067056033000199022353626787662506103515625;; x=542293.51962044; diff=542484.6796875
a=2038327161; b=15965490; c=-127.67081755712; c=-127.6708175571185108765348559245467185974121; buf=d:-127.670817557118510876534855924546718597412109375;; x=-2.5031470909319E+018; diff=-2.5031470909319E+018
a=1552683846; b=3434; c=-452150.21723937; c=-452150.2172393709770403802394866943359375000000; buf=d:-452150.2172393709770403802394866943359375;; x=-452150.09223937; diff=0.12500000005821
a=1767180075; b=8689637; c=-203.3663863059; c=-203.3663863058951619677827693521976470947266; buf=d:-203.3663863058951619677827693521976470947265625;; x=-653787083.36639; diff=-653786880
a=2084586604; b=15153324; c=-137.56629264972; c=-137.5662926497182922958018025383353233337402; buf=d:-137.566292649718292295801802538335323333740234375;; x=-1.192573347366E+026; diff=-1.192573347366E+026
a=572352535; b=587842; c=-973.65029208529; c=-973.6502920852882425606367178261280059814453; buf=d:-973.6502920852882425606367178261280059814453125;; x=-5539290.6561515; diff=-5538317.0058594
[/size]
Код:
[size=-1]
a=1501041848; b=40312; c=-37235.608454058; c=-37235.6084540583469788543879985809326171875000; buf=d:-37235.6084540583469788543879985809326171875;; x=-37235.592829058; diff=0.015625000007276
a=869175198; b=19369; c=-44874.552016108; c=-44874.5520161082167760469019412994384765625000; buf=d:-44874.5520161082167760469019412994384765625;; x=-44874.536391108; diff=0.015625000007276
a=1792743140; b=3423; c=-523734.48437044; c=-523734.4843704352970235049724578857421875000000; buf=d:-523734.4843704352970235049724578857421875;; x=-523734.35937044; diff=0.12500000011642
a=1261661400; b=3939906; c=-320.2262693577; c=-320.2262693576953438423515763133764266967773; buf=d:-320.22626935769534384235157631337642669677734375;; x=-3257924928.2263; diff=-3257924608
a=1908394071; b=13743317; c=-138.85978697865; c=-138.8597869786457010832236846908926963806152; buf=d:-138.859786978645701083223684690892696380615234375;; x=-3.8824788091702E+027; diff=-3.8824788091702E+027
a=794781190; b=12294; c=-64647.892467871; c=-64647.8924678705079713836312294006347656250000; buf=d:-64647.892467870507971383631229400634765625;; x=-64647.876842871; diff=0.015625000007276
a=1736616164; b=27236; c=-63761.791893083; c=-63761.7918930826854193583130836486816406250000; buf=d:-63761.791893082685419358313083648681640625;; x=-63761.776268083; diff=0.015625000007276
a=1712173600; b=48092; c=-35602.04607835; c=-35602.0460783498274395242333412170410156250000; buf=d:-35602.046078349827439524233341217041015625;; x=-35602.03045335; diff=0.015625000007276
a=944794606; b=9538; c=-99055.840427763; c=-99055.8404277626395924016833305358886718750000; buf=d:-99055.840427762639592401683330535888671875;; x=-99055.809177763; diff=0.03125
[/size]
При обычных запусках вылезают сообщения с небольшими отклонениями (в 8-м знаке, типа diff=0.125). При случайном запуске - полная херь. Воспроизвести гарантироавнно не удается, вылезает случайно, но стабильно.
Если взять любое глючное число и выполнить
Код:
<?
$a=1324501242; $b=3426882;
$c=-$a/$b;
$buf=serialize($c);
$x=unserialize($buf);
echo "<li>a=$a; b=$b; c=$c; c=".sprintf("%.50f",$c)."; buf=$buf; x=$x; diff=".($x-$c)."\r\n\r\n";
?>