首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将浮点数/双值转换为其IEEE754表示形式的C++

将浮点数/双值转换为其IEEE754表示形式的C++
EN

Stack Overflow用户
提问于 2020-09-29 04:28:36
回答 1查看 718关注 0票数 2

试图弄清楚这是如何工作的,但我不能把我的头脑围绕在我所代表的东西上。据我所知,我们分配了一个,没有签名的长,因为它包含的位数与浮点数相同。但是i到底代表什么呢?

我最好的解释是,我们试图将双数转换为无符号长int,因为它们具有相同的位数。这样做的最佳方法似乎是取消我们设置的指针?

任何帮助都将不胜感激!

代码语言:javascript
复制
void printDouble(double d) {

unsigned long long int i = *(unsigned long long int *)&d;

for (int j = 63; j >= 0; j--) {
    std::cout << ((i >> j) & 1);

    if (j == 63) std::cout << " ";
    else if (j == 52) std::cout << " ";
}

}

EN

回答 1

Stack Overflow用户

发布于 2020-09-29 05:37:03

在大多数(但不是所有)平台上,floatdouble使用IEEE754表示来近似实数。有关位元的含义,请参见例如754。简单地说,在IEEE-754 64位双倍中,有一个符号位、一个11位指数和一个52位意义(也就是尾数)以如下形式表示实数:

代码语言:javascript
复制
sign ⋅ 2^(exponent − 1023) ⋅ (1.0 + significand / 2^52)

除此之外还有一些特殊情况(无穷大、非数亚法线签名零),但这是基本思想。如果你在寻找更深层次的参考资料,一本很棒的书就是Michael L. Overton,“IEEE浮点算法的数值计算”

注意,取消引用*(unsigned long long int *)&d是未定义的行为,正如其他人所评论的那样。如果你真的想把一个双比特变成一个64位的int,一个安全的方法就是通过memcpy:

代码语言:javascript
复制
uint64_t bits;
std::memcpy(&bits, &d, sizeof(d));
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64112903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档