Tag: 浮点

C浮点精度

可能重复: 浮点比较 我对C / C ++中float的准确性有疑问。 当我执行以下程序时: #include int main (void) { float a = 101.1; double b = 101.1; printf (“a: %f\n”, a); printf (“b: %lf\n”, b); return 0; } 结果: a: 101.099998 b: 101.100000 我相信浮点数应该是32位所以应该足以存储101.1为什么?

计算浮点数中“。”后面的位数?

这是一个面试问题。 你如何计算之后的数字位数. 在浮点数。 例如,如果给出3.554输出= 3 对于43.000输出= 0。 我的代码片段就在这里 double no =3.44; int count =0; while(no!=((int)no)) { count++; no=no*10; } printf(“%d”,count); float类型无法指示一些数字。 例如, float类型没有73.487 , float c表示的数字是73.486999999999995来近似它。 现在如何解决它,因为它正在进行一些无限循环。 注意:在IEEE 754规范中,32位浮点数被分为24 + 7 + 1位。 7位表示尾数。

浮点错误是什么-1。#J是什么意思?

最近,有时(很少)从我们的应用程序导出数据时,导出日志包含看起来像“-1。#J”的浮点值。 我无法重现它所以我不知道浮点数在二进制文件中是什么样的,或者Visual Studio如何显示它。 我试着查看printf的源代码,但没有找到任何东西(不是100%肯定我看了正确的版本虽然…)。 我试过谷歌搜索但谷歌抛出任何#,似乎。 我找不到任何浮动错误列表。

在C中有效地提取double *的小数部分

我希望采用IEEE双精度并以最有效的方式删除它的任何整数部分。 我想要 1035 ->0 1045.23->0.23 253e-23=253e-23 我不关心正确处理非正规,无穷大或NaN。 我不介意有点麻烦,因为我知道我正在使用IEEE双打,所以它应该适用于各种机器。 无分支代码将是更受欢迎的。 我的第一个念头是(伪代码) char exp=d.exponent; (set the last bit of the exponent to 1) d<0); (& mask the last 52 bits of d) (shift d left until the last bit of the exponent is zero, decrementing exp each time) d.exponent=exp; 但问题是我无法想到一个有效的方法来向左移动直到指数的最后一位为零,而且如果没有设置所有最后一位,它似乎需要输出零。 这似乎与基数2对数问题有关。 对此算法或任何更好的算法的帮助将非常感激。 我应该注意到我想要无分支代码的原因是因为我希望它能有效地进行矢量化。

为什么在大型浮子上添加一个小浮子只会掉落一个小浮子?

说我有: float a = 3 // (gdb) p/fa = 3 float b = 299792458 // (gdb) p/fb = 299792448 然后 float sum = a + b // (gdb) p/f sum = 299792448 我认为它与尾数移动有关。 有人能解释到底发生了什么吗? 32位

如何手动(按位)执行(浮点)x?

现在,这是我应该实现的函数的函数头: /* * float_from_int – Return bit-level equivalent of expression (float) x * Result is returned as unsigned int, but * it is to be interpreted as the bit-level representation of a * single-precision floating point values. * Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while * Max ops: 30 * Rating: […]

什么浮点值使sprintf_s()产生“1.#QO”?

我有一些(遗留嵌入式c)代码,它通过一些sprintf调用生成.csv文件。 偶尔我会看到1.#QO值。 我已经尝试重现那些应该给出负无穷大,正无穷大和NaN的条件的值,但它们似乎都没有给我神奇的1.#QO结果。 那产生这个价值的是什么呢? ……是的,我知道在产生这种价值的数学中显然出现了问题,但理解它的含义将有助于调试工作。 [编辑1]进行转换的实际行是: sprintf_s(txt, CSV_HEADER_SIZE, “%.3f”, value); 哪里: #define CSV_HEADER_SIZE (100) char txt[CSV_HEADER_SIZE]; 我正在使用MS Visual Studio 2008进行编译。 [编辑2]更多挖掘显示0xFFFFFFFF给-1.#QO : unsigned int i = 0xFFFFFFFF; float* f = (float*)&i; printf(“%.3f”, *f); // gives -1.#QO ..并在Visual Studio调试器中查看它将其扩展为-1.#QNAN00所以看起来这可能是微软特定的NaN表示?

我的fma()坏了吗?

在使用double fma(double x, double y, double z); 我希望下面的输出行中标有’?’的非零d 。 内部似乎只使用long double精度而不是指定的无限精度 。 fma函数计算( x × y )+ z ,舍入为一个三元运算:根据当前舍入模式,它们将值(如同)计算为无限精度并对结果格式舍入一次。 §7.12.13.12(我的重点) 那么我的fma()坏了,或者我在代码或编译选项中如何错误地使用它? #include #include #include int main(void) { // Invoking: Cygwin C Compiler // gcc -std=c11 -O0 -g3 -pedantic -Wall -Wextra -Wconversion -c -fmessage-length=0 // -v -MMD -MP -MF”xd” -MT”xo” -o “xo” “../xc” printf(“FLT_EVAL_METHOD %d\n”, FLT_EVAL_METHOD); […]

浮点数不能按预期工作

在下面的代码中,当我输入为1 10 2 1 2 2时,总和打印为52,sum3打印为31.200001,而它的输入为31.200000 int main(){ int t,n,i,a[2000],m,j,f; scanf(“%d”,&t); while(t–){ scanf(“%d”,&n); scanf(“%d”,&f); for(i=0;i<f;i++){ scanf("%d",&a[i]); } scanf("%d",&m); if(n!=0){ int sum=n*(n+1)/2; int sum2=0; for(j=0;j<i;j++){ sum2+=a[j]; } sum-=sum2; printf("%d\n",sum); float sum3; if(n%2==0) sum3=(1.0-2.0*m/n)*sum; else sum3=(1.0-2.0*m/(n+1))*sum; printf("%f\n",sum3); } else printf("0.0000\n"); } return 0; }

假设使用C中的IEEE754浮点表示浮点数是否安全?

浮点是在C中定义的实现。因此没有任何保证。 我们的代码需要是可移植的,我们正在讨论在我们的协议中使用IEEE754浮点数是否可以接受。 出于性能原因,如果我们不必在发送或接收数据时在固定点格式之间来回转换,那将是很好的。 虽然我知道平台和架构之间可能存在关于long或wchar_t大小的差异。 但我似乎无法找到任何关于float和double具体信息。 到目前为止,我发现字节顺序可能在大端平台上反转。 虽然有没有浮点支持的平台,其中包含float和double的代码甚至不会链接。 否则平台似乎坚持IEEE754单精度和双精度。 因此可以安全地假设浮点在IEEE754可用时? 编辑:回应评论: 你对“安全”的定义是什么? 安全我的意思是,一个系统上的位模式在另一个系统上意味着相同(在字节旋转之后处理字节序)。