在 C++ 中添加 IEEE-754 浮点数和浮点数

Adding a IEEE-754 Floating Point and a Float number in C++

提问人:Tah_Ra 提问时间:10/18/2023 最后编辑:500 - Internal Server ErrorTah_Ra 更新时间:10/18/2023 访问量:81

问:

我有两个变量。

variable_1 = 01000001000011110101110000101001(IEEE-754 浮点格式为 0x410f5c29),十进制为 8.96。

float variable_2 = 0.2 

我想添加它们

float variable_3 = variable_1 + variable_2; // in C++

我只需要知道如何将它们分配给变量,以便它们被采用。这将包括声明variable_1并将其同化为值。

C++ 的IEEE-754

评论

6赞 Retired Ninja 10/18/2023
将这些位放入一个 32 位无符号的 int 中。 memcpy 从 int 到浮点数。
0赞 Homer512 10/18/2023
请参阅什么是严格的锯齿规则?特别是“什么是类型双关语”部分和以下部分

答:

1赞 Eric Postpischil 10/18/2023 #1

将无符号整数设置为所需的位,并用于将它们复制到:std::memcpyfloat

#include <cstdint>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <limits>


int main()
{
    uint32_t au = 0x410f5c29;
    float    a;

    static_assert(sizeof (float) == sizeof (uint32_t),
        "sizes of float and uint32_t must be the same");
    std::memcpy(&a, &au, sizeof a);

    float    b  = .2;
    float    c  = a+b;

    std::cout << std::setprecision(99);
    std::cout << "a = " << a << ".\n";
    std::cout << "b = " << b << ".\n";
    std::cout << "c = " << c << ".\n";
}

示例输出:

a = 8.96000003814697265625.
b = 0.20000000298023223876953125.
c = 9.159999847412109375.

评论

0赞 David C. Rankin 10/18/2023
对 ?例如std::memcpyunionunion { float f; uint32_t u; } fu; fu.u = 0x410f5c29; float a = fu.f;
1赞 Eric Postpischil 10/18/2023
@DavidC.Rankin:这个问题被标记为C++。C 标准定义读取除最后一个写入的联盟成员之外的联盟成员,以重新解释其位。C++ 标准没有定义它。编译器将优化一个像这样的短常量。std::memcpy
0赞 David C. Rankin 10/18/2023
很有道理。谢谢!