可以和另一个浮点数相加的最小浮点数
smallest float that can be summed to another float
假设有一个 7 位数的浮点数,如何找到可以添加到该浮点数的最小数字?
示例 1:1234.567f + 0000.001f = 1234.568f
示例 2:0.01234567 + 0.00000001f = 0.01234568f
要找到最小的 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.
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()
The nextafter
functions determine the next representable value, in the type of the function, after x
in the direction of y
... C11dr §7.12.11.3 2
#include <math.h>
float smallest_change(float f) {
float dif = f - nextafterf(f, 0);
return dif;
}
[编辑]
正确地指出,即使更小,也许大约 1/2 dif
也会影响变化。会思考这个。
假设有一个 7 位数的浮点数,如何找到可以添加到该浮点数的最小数字?
示例 1:1234.567f + 0000.001f = 1234.568f
示例 2:0.01234567 + 0.00000001f = 0.01234568f
要找到最小的 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.
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()
The
nextafter
functions determine the next representable value, in the type of the function, afterx
in the direction ofy
... C11dr §7.12.11.3 2
#include <math.h>
float smallest_change(float f) {
float dif = f - nextafterf(f, 0);
return dif;
}
[编辑]
1/2 dif
也会影响变化。会思考这个。