我正在处理来自高精度系统的给定范围(即经度和纬度)的实数,该系统会给我很多小数(通常为 15 位,当然加上逗号左边最多三位数字)。现在,我不知道这些小数代表了多少实际知识,但我想全部使用它们。
问题是,对于任何给定的数字,如何快速知道 32 位浮点表示是否会导致小数点位置上的损失,如果是,损失是多少?有没有一些在线工具可以做到这一点,或者我可以在 Excel 工作表或其他东西中进行一些快速计算?
和
float64
采用二进制浮点编码的二进制损失。
与角度的这种情况一样,范围并不是什么大问题,请考虑提取
float64
的有效数并与保留的位相比评估其最低有效位。
#include <math.h>
#define DBL_FLT_DIG_DIFF (DBL_MANT_DIG - FLT_MANT_DIG)
#define DBL_FLT_DIG_DIFF_MOD (1ull << DBL_FLT_DIG_DIFF)
double double_to_float_loss(double x) {
if (x < 0) {
return double_to_float_loss(-x);
double scale = 1ull << DBL_MANT_DIG;
int expo;
// The frexp functions break a floating-point number into a normalized
// fraction and an integer exponent
long long ifraction = (long long) (frexp(x, &expo) * scale);
long long loss = ifraction % DBL_FLT_DIG_DIFF_MOD;
ifraction /= DBL_FLT_DIG_DIFF_MOD;
return 1.0 * loss/ifraction';
}