浮点数在内存中的存储

芝麻775 2014-10-21 05:25:20
浮点数在内存中是按照IEEE754标准进行存储的吗?为什么对应的十六进制值不正确呢?
例:
F32 tempV;
tempV = 0.700012;
printf("tempV = 0x%x\n",tempV);

输出的十六进制值不正确!
为什么会这样呢?
...全文
218 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-10-23
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
http://bbs.csdn.net/topics/390676437
正解!
mymtom 2014-10-22
  • 打赏
  • 举报
回复
引用 3 楼 yanzi150207348 的回复:
好的 我试试 谢谢! 也就是说实际的十六进制数就是IEEE754标准表示的吗?
当然是呀!
赵4老师 2014-10-22
  • 打赏
  • 举报
回复
芝麻775 2014-10-22
  • 打赏
  • 举报
回复
好的 我试试 谢谢! 也就是说实际的十六进制数就是IEEE754标准表示的吗?
FancyMouse 2014-10-22
  • 打赏
  • 举报
回复
浮点数进printf会提升到double。你如果需要它原本的值的话那要*(int*)(&tempV)
芝麻775 2014-10-22
  • 打赏
  • 举报
回复
没有人遇到这样问题吗?
mymtom 2014-10-22
  • 打赏
  • 举报
回复

#include <stdio.h>

typedef union fu_s {
    float f;
    unsigned int u;
} fu_t;

int
main(int argc, char *argv[])
{
    fu_t fu;

    fu.f = 0.700012;
    printf("%.24f\n", fu.f);
    printf("%08X\n", fu.u);


    return 0;
}
/* 输出为
0.700012028217315673828125
3F3333FD

说明: S-符号 E-阶码 F-尾数
3F        33        33        FD
0011 1111 0011 0011 0011 0011 1111 1101

0 01111110 011 0011 0011 0011 1111 1101
S E        F

S = 0
E = 126 - 127 = -1
F = 1 + 2^-2 + 2^-3 
  + 2^-6 + 2^-7
  + 2^-10 + 2^-11
  + 2^-14 + 2^-15 
  + 2^-16 + 2^-17 + 2^-18 + 2^-19
  + 2^-20 + 2^-21 + 2^-23
  = 1.40002405643463134765625
V = 1.40002405643463134765625 * 2^-1
  = 0.700012028217315673828125
*/

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧