相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

Printf宽度说明符,用于保持浮点值的精度

是否有printf宽度说明符可以应用于浮点说明符,该说明符会自动将输出格式化为必要的有效位数,以便在重新扫描字符串时,获取原始浮点值?

例如,假设我打印float2小数位数的精度:

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,但是是否已经有一个说明符可以自动打印到必要的有效位数 - 或者至少是最大宽度?

c floating-point printf c99 floating-point-precision

84
推荐指数
8
解决办法
21万
查看次数

C++ 和 Fortran 中的不同精度

对于我正在处理的项目,我用 C++ 编写了一个非常简单的函数:

Fne(x) = 0.124*x*x,问题是当我计算函数的值时

对于x = 3.8938458092314270Fortran 77 和 C++ 语言,我得到了不同的精确度。

对于 Fortran,我得到了,Fne(x) = 1.8800923323458316而对于 C++,我得到了Fne(x) = 1.8800923630725743. 对于这两种语言,Fne 函数都针对双精度值进行编码,并且还返回双精度值。

C++代码:

double FNe(double X) {
    double FNe_out;
    FNe_out = 0.124*pow(X,2.0);
    return FNe_out;
}
Run Code Online (Sandbox Code Playgroud)

Fortran 代码:

  real*8 function FNe(X)
  implicit real*8 (a-h,o-z)
  FNe = 0.124*X*X
  return
  end
Run Code Online (Sandbox Code Playgroud)

你能帮我找出这种差异的来源吗?

c++ double fortran fortran77

4
推荐指数
1
解决办法
1018
查看次数