Floating point 将一个小范围除以另一个小范围时出现浮点错误

Floating point 将一个小范围除以另一个小范围时出现浮点错误,floating-point,Floating Point,当我有两个(小)数字min和max,并尝试使用以下代码获取介于0和1之间的值时,我可以获取小于0或大于1的值吗 double min, max, min2, max2, mid, result; // min2 < max2 is a subrange of min < max with min2 >= min and max2 <= max // where max-min may be very small, which means max2-min2 will be

当我有两个(小)数字min和max,并尝试使用以下代码获取介于0和1之间的值时,我可以获取小于0或大于1的值吗

double min, max, min2, max2, mid, result;
// min2 < max2 is a subrange of min < max with min2 >= min and max2 <= max
// where max-min may be very small, which means max2-min2 will be very small as well.
mid = (min2+max2)/2.0;
result = (mid - min)/(max-min)
并且想要得到精确的指数,即使是很小的差异

我在混合双重和浮动时遇到问题的一个示例:

NUM_BINS = 64
min = -5.00958252
max = -5.00958014
min2 = -5.0095801960014716
max2 = -5.0095799398356107
mid = (max2+min2) / 2.0
mid - min = 2.4516127083984429e-06
(mid - min) / (max - min)) * (NUM_BINS - 1) = 64.781696632504463

假设IEEE754算法,如果最小值和最大值足够接近,则差值是精确的

计算中点的平均值不一定精确(假设没有底流,则除以2是精确的,但总和不是),但以下表达式都是正确的:

min2 <= mid
mid <= max2

min2假设IEEE754算法,如果min和max足够接近,那么差值是精确的

计算中点的平均值不一定精确(假设没有底流,则除以2是精确的,但总和不是),但以下表达式都是正确的:

min2 <= mid
mid <= max2

min2你能给出一个数学论点,说明为什么
result
不能超过
1
,考虑到您没有给出与
min
max
相关的
min2
max2
的任何信息,max2=min意味着max2-min2将此添加为问题的明确注释。您能否给出一个数学论证,说明为什么
结果
不能超过
1
,考虑到您没有给出与
min
max
相关的
min2
max2
的任何信息,max2=min意味着max2-min2在问题中添加了明确的注释。我在问题中添加了值(没有十六进制,就像调试时保存的值一样)。是的,这个例子显然是错误的。它混合了float和double,这导致了这里的问题。但我不确定使用相同的浮点类型是否真的解决了问题,或者它是否可能在某些(较小)值的情况下再次发生。好吧,我明白了,舍入到较低的精度破坏了契约,因为
float(max2)
,但契约是否可以。那么我现在接受你的回答。我只是想确定一下,因为我现在可以关闭一个bug,我不确定它是否真的修复了。我在问题中添加了值(没有十六进制,它们就像我在调试时保存的一样)。是的,这个示例显然是错的。它混合了float和double,这导致了这里的问题。但我不确定使用相同的浮点类型是否真的解决了问题,或者它是否可能在某些(较小)值的情况下再次发生。好吧,我明白了,舍入到较低的精度破坏了契约,因为
float(max2)
,但契约是否可以。那么我现在接受你的回答。我只是想确定一下,因为我现在可以关闭一个bug,我不确定它是否真的修复了。