未使用Decimal()时的运行时错误



我正在努力解决这个问题。我的解决方案(如所写)给出运行时错误

import math
from decimal import Decimal
for i in range(int(input())):
v,r=map(int,input().split())
x=9.8
ans=math.degrees(math.asin(r*x/(v*v))/2)
format_float = "{:.7f}".format(ans)
print("Case #"+str(i+1)+":",format_float)

但当我使用x = Decimal(9.8)时-它被接受。

这是怎么回事?还有什么时候不使用Decimal

时间限制:60秒。内存限制:1gb。1≤t≤4500;1≤v≤300;1≤d≤10000;保证每个测试用例都是可解决的。

你可以用Decimalfloat解决所有300万允许的情况,并显示它们的不同之处和不同之处:

import math
from decimal import Decimal
def f(v, r):
try:
x=9.8
ans=math.degrees(math.asin(r*x/(v*v))/2)
format_float = "{:.7f}".format(ans)
return format_float
except:
return 'error'

def d(v, r):
try:
x=Decimal(9.8)
ans=math.degrees(math.asin(r*x/(v*v))/2)
format_float = "{:.7f}".format(ans)
return format_float
except:
return 'error'

for v in range(1, 301):
for r in range(1, 10001):
expect = d(v, r)
result = f(v, r)
if result != expect:
print(f'{v=}  {r=}  Decimal:{expect}  float:{result}')

输出:

v=21  r=45  Decimal:45.0000000  float:error
v=42  r=180  Decimal:45.0000000  float:error
v=63  r=405  Decimal:45.0000000  float:error
v=84  r=720  Decimal:45.0000000  float:error
v=119  r=1445  Decimal:45.0000000  float:error
v=126  r=1620  Decimal:45.0000000  float:error
v=161  r=2645  Decimal:45.0000000  float:error
v=168  r=2880  Decimal:45.0000000  float:error
v=175  r=3125  Decimal:45.0000000  float:error
v=231  r=5445  Decimal:45.0000000  float:error
v=238  r=5780  Decimal:45.0000000  float:error
v=245  r=6125  Decimal:45.0000000  float:error
v=252  r=6480  Decimal:45.0000000  float:error

让我们更仔细地看看最小的v=21 r=45:

x = 9.8
v = 21
r = 45
print(r*x/(v*v))

输出:

1.0000000000000002

所以,由于float的不精确,你碰巧产生了一个大于1的数字,asin然后崩溃了。

在这种情况下,避免这种情况的一种方法是保持整数直到最后的分割:

r*98/(10*v*v)

在所有允许的情况下,您将得到与Decimal相同的结果。

相关内容