将浮点数从 Fortran 传递到 .Net
我们正在将应用程序从 VB6 迁移到 .net c#。
该应用程序使用 fortran dll 来执行一些计算。 Fortran 是从我们的代码(VB6 和 c#)中调用的,我们注意到在 c# 中获取的浮点变量似乎与 vb6 中存在一些差异。
例如,如果我们有以下 Fortran 代码:
subroutine FloatTest (delta)
!ms$attributes DLLEXPORT, ALIAS: 'FloatTest ' :: FloatTest
!ms$attributes REFERENCE :: delta
real*4 delta
delta = 1.0/3.0
END
知道为什么我们在 C# 中得到浮点值 0.333333343 而不是在 VB6 中得到 0.3333333 吗?
谢谢。 尼罗
We are migrating an application from VB6 to .net c#.
The application uses a fortran dll to perform some calculations. The fortran is called from our code (VB6 and c#) and we notice that there seems to be some differences in a floating point variable fetched in c# than vb6.
So for example if we have the following fortran code:
subroutine FloatTest (delta)
!ms$attributes DLLEXPORT, ALIAS: 'FloatTest ' :: FloatTest
!ms$attributes REFERENCE :: delta
real*4 delta
delta = 1.0/3.0
END
Any idea why do we get a floating point value of 0.333333343 in c# instead of the 0.3333333 we get in VB6?
Thanks.
Niro
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
结果是准确的。 Fortran 代码使用 4 字节浮点(也称为 float 或 single),这种格式只能存储 6.5 个有效数字。打印更多只会产生随机噪声数字。使用 real*8 将精度提高到 15 位有效数字。或者修改打印语句以显示不超过6位数字。
The result is accurate. The fortran code is using 4 byte floating point (aka float or single), a format that can store only has 6.5 significant digits. Printing more just produces random noise digits. Use real*8 to improve the accuracy to 15 significant digits. Or modify the print statement to show no more than 6 digits.
您正在使用有限精度的算术。二进制数只能近似于
1/3
。看来 C# 配置为打印更多小数位,因为两个结果在前 7 位数字上一致。
C# 打印的值对您来说“似乎是错误的”,但实际上它比 VB 打印的值更准确。
You're using limited precision arithmetic. Binary numbers can only approximate
1/3
.It appears that C# is configured to print more decimal places, since both results agree in the first 7 digits.
The value printed by C# "seems wrong" to you, but it is in fact more accurate than the value printed by VB.