该%g说明符似乎并不在多数来源记录它运行得的方式行事.
根据我发现的大多数来源,在使用printf说明符的多种语言中,说明%g符应该等同于%f或者%e- 对于提供的值产生较短的输出.例如,在撰写此问题时,cplusplus.com表示说明g符意味着:
使用最短的表示:
%e或%f
而PHP手册说这意味着:
g - %e和%f中的较短者.
而且这里有一个堆栈溢出的答案是声称,
%g使用最短的表示.
而Quora的回答声称:
%g以这两个表示中最短的方式打印数字
但这种行为不是我在现实中看到的.如果我编译并运行该程序(作为C或C++ - 它是一个在两者中具有相同行为的有效程序):
#include <stdio.h>
int main(void) {
double x = 123456.0;
printf("%e\n", x);
printf("%f\n", x);
printf("%g\n", x);
printf("\n");
double y = 1234567.0;
printf("%e\n", y);
printf("%f\n", y);
printf("%g\n", y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...然后我看到这个输出:
1.234560e+05
123456.000000
123456
1.234567e+06
1234567.000000
1.23457e+06
Run Code Online (Sandbox Code Playgroud)
显然, …
我该怎么做
std::cout << 123456789.12
Run Code Online (Sandbox Code Playgroud)
打印这个:
123456789.12
Run Code Online (Sandbox Code Playgroud)
它始终打印这个:
1.23457e+008
Run Code Online (Sandbox Code Playgroud)
我知道我必须玩旗帜,但我无法弄清楚正确的组合.如果我设置固定标志,则打印
123456789.120000
Run Code Online (Sandbox Code Playgroud) 这是我的cpp代码:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double normalCDF( double x )
{
return 0.5 * ( 1.0 + erf( M_SQRT1_2 * x ) );
}
int main() {
cout << normalCDF(4.8) << endl;
cout << normalCDF(5.4) << endl;
cout << normalCDF(5.6) << endl;
cout << normalCDF(5.8) << endl;
cout << normalCDF(5.1) << endl;
cout << normalCDF(-37.5) << endl;
cout << normalCDF(-36.0) << endl;
cout << normalCDF(-37.6) << endl;
cout …Run Code Online (Sandbox Code Playgroud) 10 ^ 1.64605 = 44.2639330165
但是在C++中使用pow:
double p = pow(10,1.64605) returns 44.2641.
Run Code Online (Sandbox Code Playgroud)
有没有办法提高这里的精度?我尝试将双方都投入long double但是这也没有帮助.
更有趣的是:
cout<<p;
double a = -1.64605;
cout<<pow(10,-a);
p = pow(10, (-p));
cout<<p;
Run Code Online (Sandbox Code Playgroud)
输出是:
-1.64605
44.2639
44.2641
Run Code Online (Sandbox Code Playgroud)
为什么?
自 20 世纪 90 年代起,人们就知道如何快速准确地打印浮点数。Scheme和Java编程语言已经实现了这个算法,但我在C++中找不到类似的东西。
本质上,我正在寻找一小段高效的代码来满足以下测试用例:
void test(double dbl, const char *expected) {
std::string actual = ...;
assert(actual == expected);
}
test(3.0, "3.0");
test(3.1, "3.1");
test(0.1, "0.1");
test(1.0 / 3.0, "0.3333333333333333"); // Or maybe one more digit?
Run Code Online (Sandbox Code Playgroud)
双精度字面值会转换为浮点数,浮点数可能与字面值相同,也可能不同。然后,浮点数被转换回字符串。该字符串应尽可能短,同时表示十进制数,当解释为双精度文字时,将再次产生相同的浮点数。
如何使用 cout 以全精度打印双精度值?看起来相关,但接受的答案中的代码无法正确处理 3.1 情况。
我正在尝试将字符串转换为双精度数,但我的双精度数在小数点后第三位被截断。
我的字符串看起来像这样:“-122.39381636393”转换后它看起来像这样:-122.394
void setLongitude(string longitude){
this->longitude = (double)atof(longitude.c_str());
cout << "got longitude: " << longitude << endl;
cout << "setting longitude: " << this->longitude << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出示例:
got longitude: -122.39381636393
setting longitude: -122.394
Run Code Online (Sandbox Code Playgroud)
我希望它保留所有小数点,有什么提示吗?
double fat = 0.2654654645486684646846865584656566554566556564654654899866223625564668186456564564664564;
cout<<fat<<endl;
Run Code Online (Sandbox Code Playgroud)
结果是:
0.265465
应该是7个字符更长吗?我认为双人能举办更多吗?
我也得到了"长双"的相同结果.
为什么会发生这种行为?第六位之后的小数在 double 中递增到下一位,但在转换为 int 时不递增。
转换为 int 时会引起问题,因为尽管打印 3,d1 在转换为整数时仍然转换为 2 而不是 3
double d1 = 2.999999; //6 digits after decimal
double d2 = 2.777777;
double d3 = 2.77777; //5 digits after decimal
double d4 = 2.99999;
cout<<d1<<endl; //gives 3
cout<<(int)d1<<endl; //still gives 2 not 3
cout<<d2<<endl; //gives 2.777778
cout<<d3<<endl; //gives 2.77777 as expected
cout<<d4<<endl; //gives 2.99999 as expected
Run Code Online (Sandbox Code Playgroud)
我假设它必须与编译器或精度有关,但我不确定这种意外行为。请帮忙
我已经阅读了几个关于用C++显示浮点数的主题,我找不到令人满意的答案.
我的问题是: 如何以科学的格式(尾数/指数)显示C++中浮点数的所有有效数字?
问题是所有数字在基数10中没有相同的有效位数.
例如,a double具有15到17个有效十进制数字精度,但std::numeric_limits<double>::digits10返回15,因此,对于某些数字,我将丢失2个额外十进制数字的精度.
c++ floating-point iostream iomanip floating-point-precision
我想将所有索引值设置-1为双数组.
这是我的代码:
double dp[505];
memset(dp,-1,sizeof(dp));
cout<<dp[0]<<"\n";
Run Code Online (Sandbox Code Playgroud)
但是nan当我试图打印它的价值时,它就显示出来了.
什么nan意思?可以memset()在双数组中使用吗?