如何完整打印float or double

我们常用的cout  qDebug() 都是默认取的6位有效数字,并不能完整的显示所有的数据内容,

因此对于Qt程序, 用QString::number (a, 'g',15); 来打印完整的double, c中应该也有类似的打印代码。


在C语言中将`float`类型的数值转换为其对应的16进制表示形式,实际上就是获取该浮点数在其内部按照IEEE 754标准存储的实际二进制位模式,并将其解释为16进制字符串的形式输出出来。下面详细介绍这一过程以及给出具体的代码实现。 ### 浮点数与16进制之间的转换原理 根据IEEE 754规范,单精度(`float`)和双精度(`double`)浮点数都由三个部分组成: - **符号(Sign)**: 使用1个bit表示,0表示正数,1表示负数。 - **指数(Exponent)**: 单精度有8bits(范围[−126, +127]),双精度则有11bits。 - **尾数(Mantissa/Fraction)**: 实际上是分数的二进制表达式的一部分,在实际存储时会省略前导‘1’然后紧随其后的全是小数部分。 为了把一个给定的`float`变量的内容转换成16进制格式,我们可以先通过联合体或直接复制内存的方式来取得它们所占据的空间内的所有字节内容,之后再逐字节地把这些值转换成为易于理解的人类可读文本——即每一位代表四个二进制位的一组十六进制数字串。 下面是利用这种方法的一个简单例子: ```c #include <stdio.h> #include <string.h> /* for memcpy */ void float_to_hex(float fvalue) { unsigned char *bytes = (unsigned char*)&fvalue; #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) printf("Hexadecimal representation of %.9g on little-endian system:\n", fvalue); #else printf("Hexadecimal representation of %.9g on big-endian or unknown endianness system:\n", fvalue); #endif for(size_t i=0; i<sizeof(fvalue); ++i){ printf("%02X ", bytes[i]); } } int main(){ float testValue = 3.1415926535f; float_to_hex(testValue); return 0; } ``` 这段代码首先定义了一个名为`float_to_hex()`函数接收一个`float`参数,并打印出这个实数对应的数据块按字节数组顺序排列出来的每一个元素以两位宽的零填充大写的ASCII码表中的相应字符组成的字符串。最后主函数调用了`float_to_hex()`,传入π近似值作为一个测试实例。 **注意:** 此处需要注意系统的字节序(Byte Order),因为不同的CPU架构可能会有不同的高低字节优先级设定,所以如果是在Little Endian平台上运行以上程序,则需适当调整循环内索引遍历的方向或者反转最终得到的结果才能保证正确性。 另外还可以借助Union共用体特性来做更方便的操作而不需要考虑字节排序问题: ```c union FloatToBits { float value; struct { #ifdef _MSC_VER // MSVC compiler defines this macro. #elif defined(__BIG_ENDIAN__) unsigned int mantissa : 23; unsigned int exponent : 8; unsigned int sign : 1; #else // Assume Little Endian by default unsigned int sign : 1; unsigned int exponent : 8; unsigned int mantissa : 23; #endif } bits; }; // Then use it like so... FloatToBits ftb; ftb.value = some_float_value_here; printf("As Hex: %08x\n", ftb.bits.mantissa | ((uint32_t)(ftb.bits.exponent << 23)) | (((uint32_t)(ftb.bits.sign)) ? 0x80000000U : 0)); ``` 这种方式能够更好地反映各个字段的具体位置信息并且避免了显式的类型转换带来的风险。但是要注意跨平台移植性和编译器兼容性的潜在差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值