在Fortran中添加时,小数被视为零

时间:2019-03-26 18:00:51

标签: fortran

我正在用Fortran编写用于蒙特卡洛模拟的代码,但是由于涉及的数量很少,所以我遇到了很多问题。

最大的问题是我的代码中粒子的位置没有更新;所包含的代码看起来像这样

headers = {
    'Connection': 'Upgrade',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
    'Upgrade': 'websocket',
    'Origin': 'https://www.bet777.be',
    'Sec-WebSocket-Version': '13',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'es,en;q=0.9,pl;q=0.8,es-AR;q=0.7',
    'Sec-WebSocket-Key': 'mYc+hqhy8sUyeilrxyxSPA==',
    'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
}
ws = create_connection('wss://pushserver-uk.sbtech.com/signalr/connecttransport=webSockets&clientProtocol=1.5&connectionToken=nOugyCC54kCePwbLVXCfkfpxZsipI83mU476SdYNspEAD2U0%2F3O44lja67ujJErljZiflHtWyOwELt0OHfQhBQxXu14hVe8zE%2Fr4syolXWBCWWoG%2B2D8WwmUCxi5HSUz4&connectionData=%5B%7B%22name%22%3A%22communicationhub%22%7D%5D&tid=9',
    header=headers)

x=x+step*cos(p)*sin(t) 。这样,代码将不会更新位置,并且我得到一个无限循环,因为粒子永远不会离开该区域。如果我用这样的代码修改代码:

step=0.001

 x=x+step

没有问题。因此,乘积x=x+step*cos(t) (10 **-4阶)似乎太小,被视为零。

step*cos(t)*cos(p)的顺序为10 ** 4。

我该如何以便携式方式解决此问题?

我的编译器是最新的f95。

1 个答案:

答案 0 :(得分:2)

您的问题本质上是this other question之一。但是,添加一些特定于Fortran的注释很有用。

就像在另一个问题中一样,浮点数的离散性质意味着在某个点上,一个数字太小而不能与另一个数字相乘。对于此问题:

if (1e4+1e-4==1e4) print *, "Oh?"
if (1d4+1d-4==1d4) print *, "Really?"
end

也就是说,您可能可以使用双精度实数,并且问题会消失。

您可以添加到1e4以获得与1e4(或1d4)不同的最小数字是什么?

print *, 1e4 + SPACING(1e4), 1e4+SPACING(1e4)/2
print *, 1d4 + SPACING(1d4), 1d4+SPACING(1d4)/2
end

间距随数字的大小而变化。对于大数,它很大,在1左右,它很小。

print*, EPSILON(1e0), SPACING([(1e2**i,i=0,5)])
print*, EPSILON(1d0), SPACING([(1d2**i,i=0,5)])
end