Fortran中快速浮点数相等比较
我正在使用gfortran,我开始编写一个新程序,我知道它将有数十亿的浮点相等检查(想想“蒙特卡罗模拟”)。我需要知道两个实数是否“足够接近” 它可以是一个简单的数字(Fortran中快速浮点数相等比较,fortran,gfortran,Fortran,Gfortran,我正在使用gfortran,我开始编写一个新程序,我知道它将有数十亿的浮点相等检查(想想“蒙特卡罗模拟”)。我需要知道两个实数是否“足够接近” 它可以是一个简单的数字(a==b)或二维/三维点,甚至是复数。(不过,我主要做简单的数字。) 您是否知道gfortran的内在特性可以在这里帮助我,或者BLAS/LAPACK中的一个函数可以实现这一点。或者是一些简洁的(可能是不可移植的)技巧来快速比较? epsilon为0.0001对我来说应该足够了,但也许x86_64上的gfortran可以通过按位操
a==b
)或二维/三维点,甚至是复数。(不过,我主要做简单的数字。)
您是否知道gfortran的内在特性可以在这里帮助我,或者BLAS/LAPACK中的一个函数可以实现这一点。或者是一些简洁的(可能是不可移植的)技巧来快速比较?
epsilon为0.0001对我来说应该足够了,但也许x86_64上的gfortran可以通过按位操作优化一个神奇的数字
我真的不知道,谷歌也无法为我找到解决方案。你能吗
如果你不知道一个巧妙的技巧,你认为传统的
abs(a-b)下降=
的最快实现应该是什么。。多少钱?我建议使用a,但我不希望有太多有趣的数字,我会尝试一下。我不在乎它是<还是实际上,现在我认为它更好了,它不会有任何区别。如果你想一想根据godbolt(在C和gcc9中)在选通级别会发生什么,那么可能没有神奇的快速比较技巧,一个调用seta(如果高于设置字节),另一个调用setnb(如果不低于设置字节)。它的作用正好相反,但这并不重要(只要测试是否未设置位,而不是检查是否设置了字节,就可以了),编译器真的很聪明。顺便说一句,如果你反汇编“return(fabsf(a-b)<0.0000)”,asm代码是“xor eax,eax;ret;”:ddrring=
应该已经更快了。。多少钱?我建议使用a,但我不希望有太多有趣的数字,我会尝试一下。我不在乎它是<还是实际上,现在我认为它更好了,它不会有任何区别。如果你想一想根据godbolt(在C和gcc9中)在选通级别会发生什么,那么可能没有神奇的快速比较技巧,一个调用seta(如果高于设置字节),另一个调用setnb(如果不低于设置字节)。它的作用正好相反,但这并不重要(只要测试位是否未设置,而不是检查字节是否已设置,就可以了)编译器真的很聪明。顺便说一句,如果你反汇编“return(fabsf(a-b)<0.0000)”,asm代码是“xor eax,eax;ret;”:D