两次商店有什么

What does double store?

本文关键字:什么 两次      更新时间:2023-10-16

我将值4 *cos( fmod( acos(2.0/4.0), 2*3.14159265) )作为double发送到此功能,但我将输出作为

获得
2
1k1

这里有什么问题?

void convert_d_to_f(double n)
{
    cout<<n<<" ";
    double mantissa;
    double fractional_part;
    fractional_part = modf(n,&mantissa);
    double x = fractional_part;
    cout<<mantissa<<"k"<<fractional_part<<'n';
}

问题在于cout在打印时会截断并绕双倍。您可以使用iomanip库打印所需的小数位数。

#include <iostream>
#include <cmath>
#include <iomanip>
void convert_d_to_f(double n)
{
    cout<<std::fixed<<std::setprecision(20); //number of decimal places you need to print to
    cout<<n<<" ";
    double mantissa;
    double fractional_part;
    fractional_part = modf(n,&mantissa);
    double x = fractional_part;
    cout<<mantissa<<"k"<<fractional_part<<'n';
}
int main() {
    convert_d_to_f(4 *cos( fmod( acos(2.0/4.0), 2*3.14159265) ));
    return 0;
}

出于所有实际意图和目的,您的编号n评估为2。如果您希望它显示为1.9999999...等。请遵循Kapil的解决方案,并将std::cout的浮点精度设置为许多十进制位置。请记住,如果要走那条路,精度和准确性之间的区别。

话虽如此,您的void convert_d_to_f(double n)功能正在复制std::frexp(double arg, int* exp)的功能,并在将结果打印到屏幕后的范围内限制了范围。如果您希望在计算它们之后使用指数和曼蒂萨值,那么您可以这样做。

#include <iostream>
#include <cmath>
int main()
{
    double n = 4 *cos( fmod( acos(2.0/4.0), 2*3.14159265) );
    std::cout << "Given the number " << n << std::endl;
    // convert the given floating point value `n` into a
    // normalized fraction and an integral power of two
    int exp;
    double mantissa = std::frexp(n, &exp);
    // display results as Mantissa x 2^Exponent
    std::cout << "We have " << n << " = "
        << mantissa << " * 2^" << exp << std::endl;
    return 0;
}