1
0

注意:Julia で,整数演算のオーバーフローのために正しい結果が得られない

Posted at

ちょっと長い計算式で,うっかりするととんでもないことになりかねないので注意が必要。

(a, b, d) = (3000, 4000, 456)
(1/(a*b)*(a*b*(a + b) - d*(a^2 + b^2) - sqrt((-a*b*(a + b) + d*(a^2 + b^2))^2 - 2*a^3*b^3)))
# 5829.850417385261

答えとして 5829.850417385261 が表示されるが,これは正しくない。エラーメッセージなどは一切表示されない。

a, b, c を浮動小数点数にすると正しい答え 2500.0 が得られる。

(a, b, d) = (3000.0, 4000.0, 456.0)
(1/(a*b)*(a*b*(a + b) - d*(a^2 + b^2) - sqrt((-a*b*(a + b) + d*(a^2 + b^2))^2 - 2*a^3*b^3)))
# 2500.0

R では特に指定しない限り変数は double なので,何もしなくても正しい答えが得られる。

> a = 3000; b = 4000; d = 456
> (1/(a*b)*(a*b*(a + b) - d*(a^2 + b^2) - sqrt((-a*b*(a + b) + d*(a^2 + b^2))^2 - 2*a^3*b^3)))
[1] 2500

Python では整数は必要ならば自動的に長精度演算が行われるので,この場合も特に何もしなくても正しい答えが得られる。

>>> import math
>>> (a, b, d) = (3000, 4000, 456)
>>> (1/(a*b)*(a*b*(a + b) - d*(a**2 + b**2) - math.sqrt((-a*b*(a + b) + d*(a**2 + b**2))**2 - 2*a**3*b**3)))
2500.0
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0