是否有printf宽度说明符可以应用于浮点说明符,该说明符会自动将输出格式化为必要的有效位数,以便在重新扫描字符串时,获取原始浮点值?
例如,假设我打印float到2小数位数的精度:
float foobar = 0.9375;
printf("%.2f", foobar); // prints out 0.94
Run Code Online (Sandbox Code Playgroud)
当我扫描输出时0.94,我没有符合标准的保证我将获得原始的0.9375浮点值(在这个例子中,我可能不会).
我想要一种方法告诉printf自动将浮点值打印到必要的有效位数,以确保它可以扫描回传递给的原始值printf.
我可以使用一些宏float.h来导出要传递的最大宽度printf,但是是否已经有一个说明符可以自动打印到必要的有效位数 - 或者至少是最大宽度?
我想知道将浮点数比较到三位小数的最快方法.我有类似的东西
float lhs = 2.567xxxx
float rhs = 2.566xxxx
Run Code Online (Sandbox Code Playgroud)
上面应该是不同的,如果它是这样的
float lhs = 2.566xxxx
float rhs = 2.566xxxx
Run Code Online (Sandbox Code Playgroud)
它们应该是一样的
更新:
我正在尝试以下方面
double trunc(double d)
{
return (d>0) ? floor(d) : ceil(d) ;
}
bool comparedigits(float a , float b)
{
if (trunc(1000.0 * a) == trunc(1000.0 * b))
{
return true;
}
return false;
}
float g = 2.346;
float h= 2.34599;
bool t = comparedigits(g,h) ; //Not the same and should return false;
Run Code Online (Sandbox Code Playgroud)
然而它正在回归真实.
我用浮动遇到了一些奇怪的舍入行为.下面的代码演示了这个问题.解决这个问题的最佳方法是什么?我一直在寻找解决方案,但没有太多运气.
#include<stdio.h>
int main(void)
{
float t;
t = 5592411;
printf("%f\n", 1.5*t);
t *= 1.5;
printf("%f\n", t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码应打印出相同的值,但我在使用GCC 4.7.2进行设置时得到了这个值:
8388616.500000
8388616.000000
如果我使用计算器,我得到第一个值,所以我假设第二个值是以某种方式舍入.我有相同的Fortran代码,它不会对值进行舍入(具有0.5).
我有一个程序,我需要在浮点数的情况下打印FLOAT或在常规数字的情况下打印INTEGER.
示例伪代码
float num = 1.5;
if (num mod sizeof(int)==0)
printf ("INTEGER");
else
printf("FLOAT");
Run Code Online (Sandbox Code Playgroud)
例如:
这样的事情会起作用吗?