Tag:

在整数中获取double值的小数部分而不会丢失精度

我想将double值的小数部分转换为精度,最多4位数转换为整数。 但是当我这样做时,我会失去精确度。 有什么方法可以让我获得精确的价值吗? #include int main() { double number; double fractional_part; int output; number = 1.1234; fractional_part = number-(int)number; fractional_part = fractional_part*10000.0; printf(“%lf\n”,fractional_part); output = (int)fractional_part; printf(“%d\n”,output); return 0; } 我期待输出为1234但它给出1233.请建议一种方式,以便我可以获得所需的输出。 我想用C语言的解决方案。

printf和scanf如何处理浮点精度格式?

请考虑以下代码段: float val1 = 214.20; double val2 = 214.20; printf(“float : %f, %4.6f, %4.2f \n”, val1, val1, val1); printf(“double: %f, %4.6f, %4.2f \n”, val2, val2, val2); 哪个输出: float : 214.199997, 214.199997, 214.20 | <- the correct value I wanted double: 214.200000, 214.200000, 214.20 | 我知道214.20有一个无限的二进制表示。 第一行的前两个元素具有预期值的近似值,但最后一个元素似乎根本没有近似值,这引出了以下问题: scanf , fscanf , printf , fprintf (等)函数如何处理精度格式? 由于没有提供精度, […]

C – 打印的双精度50个有效数字会产生不准确的值

我正在为我的微积分课做Riemann总和的整合程序。 我决定在计算积分时使用C,并且我注意到我的程序中存在一个巨大的错误,这个错误来自于这个问题。 #include #include #include int main(int argc, char** argv) { double x = 2.0/20.0; printf(“%1.50f \n”, x); return (EXIT_SUCCESS); } 该程序给了我:0.10000000000000000555111512312578270211815834045410。 我的问题:为什么会这样? 我该如何解决这个问题? 或者至少四舍五入到小数点后15位? 谢谢您的帮助。

双乘法在32位平台的编译时和运行时之间有所不同

我正在32位和64位平台上编译并运行以下程序: int main() { double y = 8.34214e08; double z = 1.25823e45; return y * z == 8.34214e08 * 1.25823e45; } 虽然在64位中结果是预期的(值是相同的,退出代码是非零的)在32位似乎在编译时计算的值,比较的右侧和左侧之间存在一点差异在运行时计算的一面。 这是编译器中的错误还是有逻辑解释? 编辑:这与为什么比较双重和浮动导致意外结果不同? 因为这里所有的价值都是双倍的。

float_t有什么意义,应该何时使用?

我正在与一个使用旧版本GCC(确切地说是3.2.3)的客户合作,但是想要升级,并且作为升级到更新版本的绊脚石的一个原因是float_t类型的大小不同这当然是正确的: 在GCC 3.2.3上 sizeof(float_t) = 12 sizeof(float) = 4 sizeof(double_t) = 12 sizeof(double) = 8 关于GCC 4.1.2 sizeof(float_t) = 4 sizeof(float) = 4 sizeof(double_t) = 8 sizeof(double) = 8 但这种差异的原因是什么? 为什么尺寸变小,什么时候应该也不应该使用float_t或double_t ?

为什么这段简单的代码不起作用?

我试图将浮动变量精确到3个小数点进行比较计算。 我正在尝试下面的方法,但它不起作用。 我不知道为什么不,所以请有人告诉我哪里出错了。 此代码的输出为b = 10000.050617, bb = 10000050 and fbb = 10000.000 。 我希望fbb为10000.050。 int bb; double m,n,p,q,b,t,u,fbb; m=24.161, n=57.695, p=67.092, q=148.011; t=pm; u=qn; b=t*t+u*u; bb=b*1000; fbb=bb/1000; printf(“b=%.6lf,bb=%i,fbb=%.3lf\n”,b,bb,fbb); return 0;

Scanf没有读取双倍

我试图使用scanf连续读取用户的double值。 码: printf(“Enter A value: \n”); double input; int result = scanf(“%f”, &input); printf(“INPUT: %f\n”, input); 输出是 INPUT: 0.000

交换1000位数字与10位数字(C)

我试图切换例如:输入54321.987,然后4和2应该切换,所以输出将是52341.987。 54321.777应该成为52341.777。 如果它是2345.777,它应该是4325.777。 比我不关心的任何东西。 但如果它像888886543.777那样只有第二个和第四个数字应该从逗号之前的最右边部分切换。 所以它会变成888884563.777 因此,正如LearningC建议的那样,我试图仅用1000s数字与10s数字交换。 但无论我尝试什么,我都会遇到错误。 我无法传递错误。 我该怎么做? 到目前为止,实际上有效的是: int main(int argc, char** argv) { double x; scanf(“%lf”, &x); double tens = ((int) (x / 10)) % 10; double thousands = ((int) (x / 1000)) % 10; printf(“%09.3f”, x += (tens – thousands) * 990.0); return 0; } 上面的代码现在有效。

如何规范尾数

我正在尝试将int转换为自定义浮点数,其中用户指定为exp和尾数保留的位数,但我不明白转换是如何工作的。 我的函数接受一个int值,而int exp表示数字(值* 2 ^ exp),即值= 12,exp = 4,返回192.但我不明白我需要做的更改这些过程。 我已经看了好几天并玩IEEE转换器网络应用程序,但我只是不明白规范化过程是什么。 就像我看到它“移动二进制点并调整指数”但我不知道这意味着什么,有人能给我一个例子吗? 我也不明白指数偏差是什么。 我唯一的信息是你只是给你的指数添加一个数字,但我不明白为什么。 我一直在谷歌搜索一个我能理解的例子,但这对我没有任何意义

在C中翻转双/浮点符号的最快方法

在C中翻转双(或浮点)符号的最快方法是什么? 我想,直接访问符号位将是最快的方法,并找到以下内容: double a = 5.0; *(__int64*)&a |= 0x8000000000000000; // a = -5.0 float b = 3.0; *(int*)&b |= 0x80000000; // b = -3.0 但是,上述内容不适用于负数: double a = -5.0; *(__int64*)&a |= 0x8000000000000000; // a = -5.0