我的浮动值与C中的值不匹配

时间:2019-06-20 13:56:50

标签: c floating-point

我正在尝试将开发板与覆盆子连接。 我必须通过modbus来将值读/写到板上,但是不能像板一样写浮点值。

我正在使用C和Eclipse调试透视图来直接查看变量的值。 董事会寄给我0x46C35000至12月应该值25'000,但日食显示我1.18720512e + 009 ...

当我在该网站http://www.binaryconvert.com/convert_float.html?hexadecimal=46C35000上尝试时,我获得了25,000。

出什么问题了? 为了测试目的,我使用了这个:

int main(){

    while(1){ // To view easily the value in the debug perspective 
        float test = 0x46C35000;
        printf("%f\n",test);
    }
    return 0;
}

谢谢!

4 个答案:

答案 0 :(得分:6)

执行此操作时:

float test = 0x46C35000;

您将设置为0x46C35000(十进制1187205120),而不是表示形式

您可以执行以下操作:

union {
    uint32_t i;
    float f;
} u = { 0x46C35000 };

printf("f=%f\n", u.f);

这可以安全地将无符号的32位值解释为float

答案 1 :(得分:4)

您混淆了逻辑值和内部表示。您的分配设置了,此后为0x46C35000,即1187205120。

要设置浮点数的内部表示,您需要对如何在内存中表示浮点数做出一些假设。不过,在通用计算机上,您正在使用的网站(IEEE 754,32位)上的假设是合理的。

要更改内部表示,请使用memcpy将原始字节复制到浮点数中:

// Ensure our assumptions are correct:

#if !defined(__STDC_IEC_559__) && !defined(__GCC_IEC_559)
#    error Floating points might not be in IEEE 754/IEC 559 format!
#endif

_Static_assert(sizeof(float) == sizeof(uint32_t), "Floats are not 32 bit numbers");
float f;
uint32_t rep = 0x46C35000;
memcpy(&f, &rep, sizeof f);
printf("%f\n", f);

输出:25000.000000

(这需要stdint.h的标头uint32_tstring.h的标头memcpy。)

答案 2 :(得分:3)

分配给0x46C35000的常量float会将int的值1187205120隐式转换为float,而不是将这些位直接覆盖到IEEE-754浮点数中点格式。

对于这种事情,我通常使用union

typedef union xFU
{
    float f;
    uint32_t i;
} FU;

int main()
{
    FU foo;

    foo.f = 25000.0;
    printf("%.8X\n", foo.i);

    foo.i = 0x46C35000;
    printf("%f\n", foo.f);

    return 0;
}

输出:

46C35000
25000.000000

答案 3 :(得分:0)

通过地址访问数据时,您可以了解它们在内存中的表示方式:

function hiddenrowssummary() {

  ss=SpreadsheetApp.getActiveSpreadsheet();
  var summary=ss.getSheetByName('Summary');

  var originaldata=summary.getRange(1,1,summary.getLastRow()-1,summary.getLastColumn()).getValues();


  var filtervalues= originaldata.filter(filterlogic);

  Logger.log(filtervalues);


}




var filterlogic= function(item){

     return item[4]==="TRUE";

}

和结果:

#include <stdio.h>

int main()
{
    float f25000; // totally unused, has exactly same size as `int'
    int i = 0x46C35000; // put binary value of 0x46C35000 into `int' (4 bytes representation of integer)
    float *faddr; // pointer (address) to float
    faddr = (float*)&i; // put address of `i' into `faddr' so `faddr' points to `i' in memory

    printf("f=%f\n", *faddr); // print value pointed bu `faddr'

    return 0;
}

它的作用是: 将$ gcc -of25000 f25000.c; ./f25000 f=25000.000000 放入整型0x46C35000

i的地址复制到i,这也是指向内存中数据的地址,在这种情况下为faddr类型

float指向的打印值;将其视为faddr类型

您得到float