IEEE754:保证分割结果

EML*_*EML 2 floating-point ieee-754

考虑:

\ x/10 ^ y = z.5

x是正整数,其最大值不可能高于约10,000,000.

y是一个小整数,> = 0,最大值约为5; 如有必要,我可以设置上限.

计算z,然后四舍五入到最接近的整数,中间的情况向上舍入.我对数字正确答案向上舍入的情况感兴趣,但双精度754给出了"错误"答案,然后向下舍入.因此,换句话说,数值正确的结果具有> = 0.5的小数部分,但实际结果的小数部分<0.5.

我正在使用的语言不允许我访问FPU设置,因此我只能使用默认设置(主要是x86_64,Linux和Windows).

我是否必须接受某些答案是"错误的",或者我可以对xy设置一些限制,以保证给出所需的答案?或者是否有另一种计算方法可以在舍入后给出正确的答案?如果有必要的话,我也可以改变z如何舍入的定义,如果我能真正对结果做出保证的话.

Eri*_*hil 6

假设:

  • X ≤10,000,000.
  • 0≤ ý ≤5.
  • 使用IEEE-754基本64位二进制浮点,具有从舍入到最近的连接.

那么除法的结果永远不是分数部分小于1/2但是舍入到1/2的数字.

x = 10,000,000且y = 0 时出现最大结果,在这种情况下z = 10,000,000.那么z的整数部分有24位.浮点格式在有效数字中有53位,因此29可用于小数部分.这意味着任何小于½ - 2 -30的小数部分将舍入到½ - 2 -29或更小(因为如果数学结果小于½ - 2,则可用于该分数的位能够区分为精细 - -30,有一个比½更接近它的可表示值,因此使用较低的值).

因此,只有[½ - 2 - 30,½)中的分数的精确数学结果可能小于½但舍入到½.设z为这样的值,设t为其分数部分.

从问题陈述中,我们知道z •10 y是整数(x).因此t •10 y是整数,并且即使y小于5,t •10 5也是整数.

由于是在[½ - 2 -30,1/2), •10 5是在[(1/2 - 2 -30)•10 5 1/2 10• 5)= [50000 - 2 -30 •10 5,50,000) = [50,000 - 0.0000931322574615478515625,50,000).

显然,在这个区间内没有整数,所以不存在这样的z.