我们正在将应用程序从VB6迁移到.net c#。
该应用程序使用fortran dll执行一些计算。从我们的代码(VB6和c#)中调用fortran,我们注意到在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?
感谢。 尼鲁
答案 0 :(得分:2)
您使用的是有限精度算术。二进制数字只能近似1/3
。
似乎C#配置为打印更多小数位,因为两个结果都在前7位数字中一致。
C#打印的值“看似错误”,但实际上比VB打印的值更准确。
答案 1 :(得分:2)
结果准确。 fortran代码使用4字节浮点(又名float或single),这种格式只能存储6.5位有效数字。打印更多只是产生随机噪声数字。使用real * 8将精度提高到15位有效数字。或者修改print语句以显示不超过6位数。