Tag: 浮点精度

IEEE 754:它究竟是如何工作的?

为什么以下代码的行为与C中的行为相同? float x = 2147483647; //2^31 printf(“%f\n”, x); //Outputs 2147483648 这是我的思考过程: 2147483647 = 0 1001 1101 1111 1111 1111 1111 1111 111 (0.11111111111111111111111)base2 = (1-(0.5)^23)base10 => (1.11111111111111111111111)base2 = (1 + 1-(0.5)^23)base10 = (1.99999988)base10 因此,要将IEEE 754表示法转换回小数: 1.99999988 * 2^30 = 2147483520 所以从技术上讲,C程序必须打印出2147483520,对吗?

有效地计算(a-K)/(a + K)并提高精度

在各种情况下,例如对于数学函数的参数减少,需要计算(a – K) / (a + K) ,其中a是正变量参数而K是常数。 在许多情况下, K是2的幂,这是与我的工作相关的用例。 我正在寻找比直接划分更准确地计算这个商的有效方法。 可以假设对融合乘法 – 加法(FMA)的硬件支持,因为此操作由此时所有主要CPU和GPU架构提供,并且可通过函数fma()和fmaf()以C / C ++forms提供。 为了便于探索,我正在尝试float运算。 由于我计划将方法移植到double算法,因此不能使用高于参数和结果的本机精度的操作。 到目前为止我的最佳解决方案是 /* Compute q = (a – K) / (a + K) with improved accuracy. Variant 1 */ m = a – K; p = a + K; r = 1.0f / p; q = m […]

Payne Hanek算法在C中的实现

我正在努力理解如何实现Payne和Hanek发布的范围缩减算法(三角函数的范围缩减) 我见过这个库: http : //www.netlib.org/fdlibm/ 但它看起来如此扭曲,我所创立的所有理论解释都太简单了,无法提供实现。 有一些好的……好的……好的解释吗?

使用float而不是double时输出奇怪

当我使用float而不是double时输出奇怪的输出 #include void main() { double p,p1,cost,cost1=30; for (p = 0.1; p < 10;p=p+0.1) { cost = 30-6*p+p*p; if (cost<cost1) { cost1=cost; p1=p; } else { break; } printf("%lf\t%lf\n",p,cost); } printf("%lf\t%lf\n",p1,cost1); } 在p = 3时给出预期的输出; 但是当我使用float输出有点奇怪。 #include void main() { float p,p1,cost,cost1=40; for (p = 0.1; p < 10;p=p+0.1) { cost = 30-6*p+p*p; if (cost<cost1) […]

在C ++中进行数学运算时,浮点错误如何传播?

假设我们已经声明了以下变量 float a = 1.2291; float b = 3.99; float变量有精度6,(如果我理解正确的话)意味着计算机实际存储的数量与你想要的实际数量之间的差异将小于10^-6 这意味着a和b都有一些小于10^-6错误 所以在计算机内部实际上可能是1.229100000012123而b可能是3.9900000191919 现在让我们说你有以下代码 float c = 0; for(int i = 0; i < 1000; i++) c += a + b; 我的问题是, c的最终结果是否会产生小于10^-6的精度误差? 如果答案是否定的,那么我们怎么能真正知道这个精确度错误以及如果你按照自己的意愿和任何顺序应用任何类型的操作会发生什么?

最小化C中浮点错误的经验法则?

关于最小化浮点运算中的错误,如果我在C中执行如下操作: float a = 123.456; float b = 456.789; float r = 0.12345; a = a – (r * b); 如果我将乘法和减法步骤分开,计算结果是否会改变,即: float c = r * b; a = a – c; 我想知道CPU是否会以不同方式处理这些计算,从而在一种情况下误差可能会更小? 如果不是,我认为无论如何,是否有任何良好的经验法则来缓解浮点错误? 我可以按照有用的方式按摩数据吗? 请不要只说“使用更高的精度” – 这不是我所追求的。 编辑 有关数据的信息,在一般意义上,当操作导致非常大的数字(如123456789)时,错误似乎更糟。小数字(例如1.23456789)似乎在操作后产生更准确的结果。 我想象这个,还是扩大数字有助于准确?

打印浮点数的整数部分

我试图弄清楚如何在不使用库函数的情况下打印浮点数。 打印浮点数的小数部分结果非常简单。 打印整体部件更难: static const int base = 2; static const char hex[] = “0123456789abcdef”; void print_integral_part(float value) { assert(value >= 0); char a[129]; // worst case is 128 digits for base 2 plus NUL char * p = a + 128; *p = 0; do { int digit = fmod(value, base); value /= base; […]

迭代时浮点数不精确

我有一个函数,根据范围[0, 1]的值计算3d间距。 我面临的问题是,二进制浮点数不能正好代表1。 在函数中计算的数学表达式能够计算t=1.0的值,但该函数永远不会接受该值,因为它在计算之前检查是否为该范围。 curves_error curves_bezier(curves_PointList* list, curves_Point* dest, curves_float t) { /* … */ if (t 1) return curves_invalid_args; /* … */ return curves_no_error; } 如何使用此function计算t=1.0的3d点? 前段时间我听说过关于ELLIPSIS一些事情,我认为这与这个问题有关,但我不确定。 谢谢 编辑 :好的,对不起。 我假设浮动不能完全代表1,因为我面临的问题。 问题可能是因为我正在做这样的迭代: for (t=0; t <= 1.0; t += 0.1) { curves_error error = curves_bezier(points, point, t); if (error != curves_no_error) printf("Error with t […]

你如何找到浮点数最接近的非等值?

float (aka single)值是一个4字节的值,应该表示任何实数值。 由于它的格式化方式和有限的字节数,它有一个最小值和一个可以表示的最大值,并且它具有有限的精度,具体取决于它自己的值。 我想知道是否有一种方法可以获得高于或低于某个参考值的最接近的可能值,给定浮点数的有限精度。 对于整数,这是微不足道的:一个简单地添加或减去1.但是使用float ,您不能简单地添加或减去最小浮点值并期望它与原始值不同。 即 float FindNearestSmaller (const float a) { return a – FLT_MIN; /* This doesn’t necessarily work */ } 事实上,上述几乎永远不会奏效。 在上面的例子中,返回通常仍然等于a ,因为FLT_MIN远远超出a的精度。 您可以轻松地自己尝试:它适用于例如0.0f或非常少量的订单FLT_MIN ,但不适用于0到100之间的任何数据。 那么在给定浮点精度a ,如何获得最接近但小于或大于a值? 注意:虽然我主要对C / C ++答案感兴趣,但我认为答案适用于大多数编程语言。

比较C中的相同浮点值

可能重复: 与float和float文字相比较的奇怪输出 当我尝试比较2个相同的float值时,它不会在以下代码中打印“相等的值”: void main() { float a = 0.7; clrscr(); if (a < 0.7) printf("value : %f",a); else if (a == 0.7) printf("equal values"); else printf("hello"); getch(); } 提前致谢。