可以与另一个浮点相加的最小浮点数

时间:2015-10-22 13:40:51

标签: c# floating-point epsilon

假设有一个7位数的浮点数,如何找到可以添加到该浮点数的最小数字?

示例1:1234.567f + 0000.001f = 1234.568f

实施例2:0.01234567 + 0.00000001f = 0.01234568f

2 个答案:

答案 0 :(得分:1)

要找到最小的epsilon,您可以从10eN开始,其中N是1,然后向下移动到较小的数字并添加它。然后将其与原始数字进行比较。

number = x

N = 1
newnumber = 3
while (number <> newnumber){
  newnumber = (number + 10eN)
  N = N - 1
}

Then 10e(N+1) is the smallest epsilon.

答案 1 :(得分:1)

OP在发布此C#答案后添加了C

将此C解决方案作为参考。

以指数格式打印数字并将每个数字更改为“0”或“1”

float smallest_float_summable(float f, int digs) {
  char buf[20];

  sprintf(buf, "%.*e", digs - 1, f);
  char *p = buf;
  while (*p != 'e') {
    if (isdigit(*p)) {
      *p = '0' + (p[1] == 'e');
    }
    p++;
  }
  float y;
  sscanf(buf, "%e", &y);
  return y;
}

 printf("%e\n", smallest_float_summable(1234.567f, 7));
 // 1.000000e-03

这不会得到最小,因为smallest_float_summable()的值接近1/2的数字通常会影响更改,但这似乎符合OP的意图。

要获得影响某些变化的最小数字,请使用nextafter()

  

nextafter函数在x方向y之后确定函数类型中的下一个可表示值...C11dr§7.12.11.32

#include <math.h>
float smallest_change(float f) {
  float dif = f - nextafterf(f, 0);
  return dif;
}

[编辑]

@aka.nice正确地指出,即使更小,也许约1/2 dif会影响更改。会考虑这个。