Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在最后浮动输出632?(Y=1399109632.000000),而double不会更改数字Y=1399109568.000000_C_Double_Memcpy - Fatal编程技术网

C 为什么在最后浮动输出632?(Y=1399109632.000000),而double不会更改数字Y=1399109568.000000

C 为什么在最后浮动输出632?(Y=1399109632.000000),而double不会更改数字Y=1399109568.000000,c,double,memcpy,C,Double,Memcpy,为什么在最后浮动输出632?Y=1399109632.000000,而double不会更改数字Y=1399109568.000000 #include <stdio.h> #include <conio.h> #include <string.h> int main() { float Y = 1399109568; int D; printf("Y=%f", Y); memcpy(&D, &

为什么在最后浮动输出632?Y=1399109632.000000,而double不会更改数字Y=1399109568.000000

#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
    float Y = 1399109568;
    int D;
    printf("Y=%f", Y);
    memcpy(&D, &Y, 4);
    //printf("D=%d", D);
    return 0;
}

在浮点数常用的格式中,数字表示为:

符号+或−, 从0到16777215224的整数f−1,及 指数e等于2−149至+104。 所以,如果我们设为+1或−1表示符号时,表示的值为s•f•2e

通常,用f表示为二进制数字,以“0”或“1”开头,后跟23位,e的范围为−126至+127。它们描述的是同一组数字,所使用的形式是基于方便性而选择的

对于您的号码1399109568,我们需要e至少为7。否则,使用e为6的最大f,我们可以表示的最大值为16777215•26=1073741760

指数为7时,我们可以将1399109504表示为10930543•27,将1399109632表示为10930544•27。这就是我们的两个f候选人,10930543和10930544。它们是相邻的整数,所以我们不能在它们之间选择一个f,从而更接近1399109568。我们能找到的最接近的是1399109504和1399109632

其中每一个在一个方向或另一个方向上与1399109568相差64。由于它们是等距的,通常的默认舍入规则选择f为偶数的10930544。因此,将1399109568转换为float将产生1399109632

常用的double格式精度更高。它表示一个数字,如下所示:

符号+或−, 从0到9007199254740991253的整数f−1,及 指数e等于2−1074至+971。
所以它可以精确地表示1399109568。

看起来您环境中的浮点没有足够的精度来容纳1399109568。这是否回答了您的问题?这是否回答了您的问题?