Tag: 浮点精度

各种浮动值的epsilon

FLT_MIN常量最接近零。 如何获得最接近some number数值? 举个例子: float nearest_to_1000 = 1000.0f + epsilon; // epsilon must be the smallest value satisfying condition: // nearest_to_1000 > 1000.0f 我更喜欢不使用特殊function的数字公式。

为什么这个浮点数的值会改变它的设置?

为什么这个C程序输出“错误”? #include void main() { float f = 12345.054321; printf(“%f”, f); getch(); } 输出: 12345.054688 但输出应为12345.054321 。 我在VS2008中使用VC ++。

浮点运算的准确性

我无法理解这个程序的输出 int main() { double x = 1.8939201459282359e-308; double y = 4.9406564584124654e-324; printf(“%23.16e\n”, 1.6*y); printf(“%23.16e\n”, 1.7*y); printf(“%23.16e\n”, 1.8*y); printf(“%23.16e\n”, 1.9*y); printf(“%23.16e\n”, 2.0*y); printf(“%23.16e\n”, x + 1.6*y); printf(“%23.16e\n”, x + 1.7*y); printf(“%23.16e\n”, x + 1.8*y); printf(“%23.16e\n”, x + 1.9*y); printf(“%23.16e\n”, x + 2.0*y); } 输出是 9.8813129168249309e-324 9.8813129168249309e-324 9.8813129168249309e-324 9.8813129168249309e-324 9.8813129168249309e-324 1.8939201459282364e-308 1.8939201459282364e-308 1.8939201459282369e-308 1.8939201459282369e-308 1.8939201459282369e-308 我正在使用IEEE算法。 […]

如果可以用IEEE 754中的二进制格式表示硬编码是否精确浮动?

例如,0,0.5,0.15625,1,2,3 ……是从IEEE 754转换而来的值。它们的硬编码版本是否精确? 例如: 是 float a=0; if(a==0){ return true; } 总是回归真实? 其他例子: float a=0.5; float b=0.25; float c=0.125; a * b总是等于0.125而a * b == c总是如此? 还有一个例子: int a=123; float b=0.5; a * b总是61.5? 或者一般来说,整数乘以IEEE 754二进制浮点精确? 或者更一般的问题:如果值是硬编码,并且值和结果都可以用IEEE 754中的二进制格式表示(例如:0.5 – 0.125),那么值是否准确?

与浮点数混淆

int main() { float x=3.4e2; printf(“%f”,x); return 0; } 输出: 340.000000 //没关系 但如果写x=3.1234e2则输出为312.339996 ,如果x=3.12345678e2则输出为312.345673 。 为什么输出会像这样? 我想如果我写x=3.1234e2 ,输出应该是312.340000 ,但实际输出是312.339996使用GCC编译器。

印花浮子,保持精度

我正在编写一个打印浮点文字的程序,以便在另一个程序中使用。 我需要打印多少位数才能保持原始浮点的精度? 由于浮点数具有24 * (log(2) / log(10)) = 7.2247199精度的十进制数字,我最初的想法是打印8位数就足够了。 但是,如果我运气不好,那些0.2247199会分配到7位有效数字的左侧和右侧,所以我应该打印9位小数。 我的分析是否正确? 所有情况下都是9位十进制数字吗? 像printf(“%.9g”, x); ? 是否有标准函数将float转换为具有该值所需的最小小数位数的字符串,在7或8足够的情况下,所以我不打印不必要的数字? 注意:我不能使用hex浮点文字,因为标准C ++不支持它们。

C ++浮点精度

可能重复: 浮点不准确的例子 double a = 0.3; std::cout.precision(20); std::cout << a << std::endl; 结果:0.2999999999999999889 double a, b; a = 0.3; b = 0; for (char i = 1; i <= 50; i++) { b = b + a; }; std::cout.precision(20); std::cout << b << std::endl; 结果:15.000000000000014211 所以..’a’比它应该小。 但是,如果我们采取’a’50次 – 结果会比它应该更大。 为什么是这样? 如何在这种情况下得到正确的结果?