← |
2024年11月 |
→ |
日 |
月 |
火 |
水 |
木 |
金 |
土 |
|
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
|
26 |
27 |
28 |
29 |
30 |
|
よく、プログラムなどで、intとか、long intとか、書いたり、 仕様書に整数型とか書いたりされているけれど、 たまに問題になるのが、その精度。
先日、PHPでプログラムを書いていたら見事にはまったorz
あるシステムで問題なく動作していたプログラムが、 別のシステムだと、エラーになる。
まぁ、エラーになった場所をprintデバッグしたら一発で原因は特定できたんだけど 原因がまさにデータの精度の問題。
元のシステムは32bit版のPHPで移動先のシステムが64bit版のPHPだった。
そして、PHPには数値の精度の区別はなく、 整数は、あくまでも、整数であり、 その精度は、PHPのコンパイル環境に依存している。
そのため、バイナリファイルで FF FF FF FFのデータを読み込んだら、 32bit版では-1、64bit版では4294967295と解釈されていたのが原因だった。
WindowsのC++開発では、Windows.hかどこかで
typedef BYTE unsigned __int8 typedef WORD unsigned __int16 typedef DWORD unsigned __int32 なんて定義されているので、 8bit符号無し整数、16bit符号無し整数、32bit符号無し整数を明確に区別してコードが書ける。
MMXなどのコードを書くときには
typedef QWORD unsigned __int64 なんて自分でやってもいい。
スクリプト言語は、こういう精度について細かく考えることが少ないけど、 まれに、精度についてシビアに気にしなければならない事例があるから、 気をつけねば。 |
01:10, Thursday, Feb 24, 2011 ¦ 固定リンク
¦ 携帯
|
|