C# 可以和另一个浮点数相加的最小浮点数

C# 可以和另一个浮点数相加的最小浮点数,c#,floating-point,epsilon,C#,Floating Point,Epsilon,假设有一个7位数的浮点数,如何找到可以添加到该浮点数中的最小数 示例1:1234.567f+0000.001f=1234.568f 示例2:0.01234567+0.00000001f=0.01234568f要查找最小的ε,可以从10eN开始,其中N为1,然后向下移动到较小的数字并将其相加。然后将其与原始数字进行比较 number = x N = 1 newnumber = 3 while (number <> newnumber){ newnumber = (number +

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

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


示例2:0.01234567+0.00000001f=0.01234568f

要查找最小的ε,可以从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.
number=x
N=1
newnumber=3
while(number newnumber){
新编号=(编号+10eN)
N=N-1
}
那么10e(N+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
这不会得到最小值,因为通常是一个接近1/2的数字,
最小值\u float\u summable()
的值会影响更改,但这似乎符合OP的意图


要获得影响某些更改的最小数字,只需使用
nextafter()

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

#包括
浮动最小U变化(浮动f){
float-dif=f-nextafterf(f,0);
返回dif;
}
[编辑]


正确地指出,甚至更小,可能约为
1/2 dif
也会影响更改。在C(或C++)中,您可以在下一步调用
nextafter
并进行减法运算。不幸的是,对于这个有用的操作,没有.NET包装。如果
number
的副本很大,如
1e30
,则
N
将需要以更大的值开始,如24或更大的值,而不是1。但是假设IEEE 754默认舍入模式,如果f有效位为奇数no,您可能会有更小的dif数?那么dif将是1/2ulp@aka.nice说得好。我们需要一些想法来涵盖您建议的角落案例。
#include <math.h>
float smallest_change(float f) {
  float dif = f - nextafterf(f, 0);
  return dif;
}