我将值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';
}
答案 0 :(得分:2)
问题是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;
}
答案 1 :(得分:1)
对于所有实际意图和目的,您的号码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;
}