2017/02/20

[c/c++]丸められた誤差

これくらいは大丈夫かな、と思っていたことが、大丈夫じゃないことがある。

01: #include 
02: #include 
03: 
04: int main(int argc, char *argv[])
05: {
06:     uint64_t val = 0.006 * 100000000;
07:     printf("%llu\n", (unsigned long long)val);
08: }

600000
よし。

01: #include 
02: #include 
03: 
04: int main(int argc, char *argv[])
05: {
06:     uint64_t val = 0.007 * 100000000;
07:     printf("%llu\n", (unsigned long long)val);
08: }

700000
よし。

01: #include 
02: #include 
03: 
04: int main(int argc, char *argv[])
05: {
06:     uint64_t val = 0.008 * 100000000;
07:     printf("%llu\n", (unsigned long long)val);
08: }

800000
よし。

01: #include 
02: #include 
03: 
04: int main(int argc, char *argv[])
05: {
06:     uint64_t val = 0.009 * 100000000;
07:     printf("%llu\n", (unsigned long long)val);
08: }

899999
あー、だめかー。


いやあ、コンパイルの段階で解決するものは、このくらいは大丈夫だろうと思っていたのだ。

01: #include 
02: #include 
03: 
04: int main(int argc, char *argv[])
05: {
06:     uint64_t val = 0.009 * 100000000 + 0.5;
07:     printf("%llu\n", (unsigned long long)val);
08: }

900000
これでいいや。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。