c++如何自动决定一个变量在这个程序中被存储为次正规?

问题描述 投票:0回答:1

我正在学习 C++,我真的很想了解数字在内存中的存储和操作方式。为了帮助测试我的理解,我编写了以下程序:

#include <iostream>
#include <cmath>

int main () {
    int answer = 200*300*400*500;

    std::cout << "int result: " << answer << std::endl;
    std::cout << "Size of int result: " << sizeof(answer) << std::endl;
    std::cout << "Is normal? " << isnormal(answer) << std::endl;

    float f_answer = 200.0*300*400*500;

    std::cout << "float result: " << f_answer << std::endl;
    std::cout << "Size of float result: " << sizeof(f_answer) << std::endl;
    std::cout << "Is normal? " << isnormal(f_answer) << std::endl;

    float under = 0.0000000005 * 0.0000000001 * 0.0000000001 * 0.0000000001 * 0.00001;
    std::cout << "under result: " << under << std::endl;
    std::cout << "Is normal?: " << isnormal(under) << std::endl;

    return 0;
}

基于我对 IEEE 的了解,我期望最后一个块返回下溢值(或 0),因为据我了解,32 位浮点数最精确的值大约是 e^-38。

令我惊讶的是,我能够将它一直降低到 e^-45!这让我开始研究正常与次正常。所以,太棒了......某处发现我想要更高的精度并决定这个变量应该存储为次正规。我的问题是:如何?这是在做什么?这是c++本身吗??是编译器吗? (据我所知,我正在使用 clang。)我认为使用这种语言的主要好处是,当我告诉它保存为浮点数时,我可以非常确定它在做什么。如果这是一个错误的问题,我深表歉意,这确实是我第一次涉足低级语言,非常感谢人们可以提供的任何澄清!

c++ clang++ ieee-754
1个回答
0
投票

在此程序中,C++ 不会自动决定将变量存储为次正规。相反,库中的 isnormal() 函数用于确定给定的浮点数是否正常。

如果浮点数既不是零、次正规、无穷大也不是 NaN,则它被认为是“正规”的。换句话说,一个普通的浮点数有一个非零值,并且可以在不损失精度的情况下以指定的浮点格式表示。

程序中使用isnormal()函数判断f_answer和under这两个float变量是否正常。 f_answer 是通过将四个大整数和一个浮点值相乘来计算的,这可能会导致一个太大而无法精确表示为浮点数的数字。因此,它可能会四舍五入到低于正常值。

另一方面,under 是通过将几个非常小的浮点值相乘计算得出的,这可能导致数字太小而无法精确表示为浮点数。因此,它也可能四舍五入到低于正常值。

当对这些变量调用 isnormal() 函数时,如果变量是次正规的则返回 false,否则返回 true。

© www.soinside.com 2019 - 2024. All rights reserved.