【问题标题】:80 bit floating point arithmetic in C/C++C/C++ 中的 80 位浮点运算
【发布时间】:2011-08-11 04:03:11
【问题描述】:

假设一个,b_int64 变量。 需要以高精度80位浮点计算sqrt((long double)a)*sqrt((long double)b)

示例。 (__int64)(sqrt((long double)a)*sqrt((long double)a) + 0.5) != a 在许多情况下应该如此。

哪个win32 C/C++编译器可以管理80位浮点运算?

【问题讨论】:

  • C C++编译器?选择一个或明确说你需要两个。
  • long double sqrtl(long double x);
  • WTP:可以是 Win32 / amd64 的 C 或 C++ 编译器。对我来说没关系。
  • 您的问题同时使用了_int64(一个下划线)和__int64(两个下划线)。如果这是故意的,有什么区别/意义?

标签: c compiler-construction floating-point-precision


【解决方案1】:

您可能不应该使用浮点数来取整数的平方根,尤其是 long double,它的支持很差,并且在某些系统上可能具有近似值(不准确)sqrtl。而是查找整数平方根算法。

【讨论】:

  • 难度更大。我正在寻找 diofant 方程的解系统(限制为 64 位整数)。 INTEGER NUMBER sqrtl(a)*sqrtl(b) 的形式是可能解的最简单表示。
  • 我的意思是有一些方法可以直接对整数执行平方根,而无需使用浮点数。
【解决方案2】:

你确定 sqrt() 对长双精度有效吗?

至少在某些环境中 sqrt() 用于双精度数,sqrtf() 用于浮点数,sqrtl() 用于长双精度数。

【讨论】:

  • 是的。 math.h 有版本:long double sqrt(long double)
  • <math.h> 中声明的sqrt() 函数绝对是用于双精度的,而不是用于长双精度的; sqrtl() 用于长双打。但是在<tgmath.h> 中还定义了一个“类型通用宏”sqrt()(如果您的编译器支持它,这是一个相对较新的功能)。
  • @amuliar:它叫做“sqrtl”,而不是“sqrt”。
  • Open Watcom C/C++ 编译器只有 sqrt 版本。 :(
【解决方案3】:

Embarcadero 的 C++Builder 将处理 80 位浮点。使用 long double 类型,或(从 Delphi 导入)Extnded 类型。它们是一样的。

【讨论】:

  • 是的,它有 80 位,但它失败了。 a = 8642673492431640625L; Delphi 中的结果:8642673492431640624。Borland C++ 编译器 5.5:8642673492431640200
  • 好的,我刚试过:unsigned __int64 a = 8642673492431640625L; long double ld = a; printf("%0.1Lf\n", ld);,它打印:8642673492431640625.0,对我来说这似乎是正确的。那是在 C++Builder XE 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2023-03-17
  • 2012-12-15
  • 2011-03-13
  • 2021-02-20
  • 2021-11-06
  • 2012-12-04
相关资源
最近更新 更多