Floating point 从浮点转换为整数时的不同值

Floating point 从浮点转换为整数时的不同值,floating-point,type-conversion,integer,Floating Point,Type Conversion,Integer,这是我的密码: #include <stdio.h> int main() { float dt = 0.0002, t0; int it0; for ( t0 = 0.0512; t0 <= 0.0544; t0 += 0.0004 ) { it0 = (int)(t0/dt); printf("t0 = %f, it0 = %d\n",t0,i

这是我的密码:

#include <stdio.h>

int main()
{
    
    float dt = 0.0002, t0;
    int it0;
    
    for ( t0 = 0.0512; t0 <= 0.0544; t0 += 0.0004 ) {
        
            it0 = (int)(t0/dt);
            printf("t0 = %f, it0 = %d\n",t0,it0);
    }

    return 0;
}
t0=0.053200
时,
it0
应为
266
(0.0532/0.0002=266)。但这里显示的是
it0=265
。为了调查原因,我独立运行
t0=0.053200
,如下所示:

#include <stdio.h>

int main()
{
    
    float dt = 0.0002, t0 = 0.0532;
    int it0;
    
    it0 = (int)(t0/dt);
    printf("t0 = %f, it0 = %d\n",t0,it0);

    return 0;
}
我不知道为什么会这样。所以我做了另一个测试,使用下面的代码打印浮点(转换前)和整数(转换后):

#include <stdio.h>

int main()
{

    float dt = 0.0002, t0, test;
    int it0;

    for ( t0 = 0.0512; t0 <= 0.0544; t0 += 0.0004 ) {

            it0 = (int)(t0/dt);
            test = t0/dt;
            printf("t0 = %f, it0 = %d / %f\n",t0,it0,test);
    }

    return 0;
}

我注意到
t0=0.053200,it0=265/265.999969
。我猜转换为整数会使
265.999969
成为一个错误的数字,即
265
。您知道如何解决这个问题吗?

以下假设我们的C实现使用IEEE-754 binary32格式表示
浮点
,使用binary64格式表示
双精度
,这是非常可能的


for(t0=0.0512;t0尝试
it0=(int)(t0/dt);
-->
it0=(int)轮(t0/dt);
这是否回答了您的问题?
t0 = 0.053200, it0 = 266
#include <stdio.h>

int main()
{

    float dt = 0.0002, t0, test;
    int it0;

    for ( t0 = 0.0512; t0 <= 0.0544; t0 += 0.0004 ) {

            it0 = (int)(t0/dt);
            test = t0/dt;
            printf("t0 = %f, it0 = %d / %f\n",t0,it0,test);
    }

    return 0;
}
t0 = 0.051200, it0 = 256 / 256.000000                                                                                                                                              
t0 = 0.051600, it0 = 258 / 258.000000                                                                                                                                              
t0 = 0.052000, it0 = 260 / 260.000000                                                                                                                                              
t0 = 0.052400, it0 = 262 / 262.000000                                                                                                                                              
t0 = 0.052800, it0 = 264 / 264.000000                                                                                                                                              
t0 = 0.053200, it0 = 265 / 265.999969                                                                                                                                              
t0 = 0.053600, it0 = 267 / 267.999969                                                                                                                                              
t0 = 0.054000, it0 = 269 / 269.999969                                                                                                                                              
t0 = 0.054400, it0 = 271 / 271.999969
t0 = 0.0511999987065792083740234375, it0 = 256 t0 = 0.0515999980270862579345703125, it0 = 258 t0 = 0.0519999973475933074951171875, it0 = 260 t0 = 0.0523999966681003570556640625, it0 = 262 t0 = 0.0527999959886074066162109375, it0 = 264 t0 = 0.0531999953091144561767578125, it0 = 265 t0 = 0.0535999946296215057373046875, it0 = 267 t0 = 0.0539999939501285552978515625, it0 = 269 t0 = 0.0543999932706356048583984375, it0 = 271 t0*2^28 = 13743895, it0 = 256 t0*2^28 = 13851269, it0 = 258 t0*2^28 = 13958643, it0 = 260 t0*2^28 = 14066017, it0 = 262 t0*2^28 = 14173391, it0 = 264 t0*2^28 = 14280765, it0 = 265 t0*2^28 = 14388139, it0 = 267 t0*2^28 = 14495513, it0 = 269 t0*2^28 = 14602887, it0 = 271