我正在用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。
答案 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