我在Java中有算法/计算,并对其进行了单元测试。单元测试期望结果具有一定的精度/增量。现在,我将算法移植到.NET中,并希望使用相同的单元测试。我使用双重数据类型。
问题在于Java对Math类中的某些操作使用strictfp(64位)。 .NET始终使用FPU/CPU(80位)。 .NET更精确,更快。 Java更容易预测。
由于我的算法是循环的并且可以重用上一轮的结果,因此误差/差异/更精确的累积会太大。我不依赖速度(用于单元测试)。我很高兴在生产中使用.NET精度,但是我想验证实现。
考虑一下来自JDK的情况
public final class Math {
public static double atan2(double y, double x) {
return StrictMath.atan2(y, x); // default impl. delegates to StrictMath
}
}
我正在寻找在.NET 中使用严格FP的库或技术。
占先的评论:我确实了解IEEE 754格式以及浮点数不是精确的十进制数或分数的事实。没有小数,没有BigInt或BigNumber。谢谢,请不要这样回答。
最佳答案
不幸的是,没有办法在C#中强制执行FP严格性,.Net CLR只是缺乏以最大可能的精度进行计算的能力。
我认为这样做可以提高性能-它不会检查您是否希望降低精度。也没有必要-.Net不在虚拟机中运行,因此不必担心使用不同的浮点处理器。
但是strictfp
不是可选的吗?您可以在没有strictfp
修饰符的情况下执行Java代码吗?然后,它应该采用与.Net相同的浮点机制
因此,与其强制.Net使用strictfp
并检查它是否与Java代码具有相同的值,还可以强制Java不使用strictfp
并检查它是否与.Net代码相同。