2

我一直在尝试使用英特尔的四精度浮点数。我有以下代码,它返回意外结果。

#include <stdio.h>
#include <math.h>

int print(const char *label, _Quad r) {
  int prec = 20;
  int width = 46;
  char buf[128];

  int n = quadmath_snprintf(buf, sizeof buf, "%+-#*.36Qe", width, r);
  printf ("%s: %s\n", label, buf);
  return 0;
}

int main () {
  _Quad x = 3.14159265358979323846264338327950288q;
  print("value", x);
  print("log", logq(x));
  print("log10", log10q(x));
  print("cos", cosq(x));
  print("sin", sinq(x));
  print("sqrt", sqrtq(x));
}

该程序返回以下结果:

value: +3.141592653589793238462643383279502797e+00   
log: +7.644623500000000000000000000000000000e+07   
log10: -6.174980530000000000000000000000000000e+08   
cos: +0.000000000000000000000000000000000000e+00   
sin: +0.000000000000000000000000000000000000e+00   
sqrt: -1.994699018000000000000000000000000000e+09   

看起来四精度文字被正确解释了。但是,函数logqlog10qcosq和正在返回不正确的结果。sinqsqrtq

我找到的关于英特尔_Quad类型的唯一方向是这里

我在 MacOS 上编译这段代码:

icc -fPIC -wd1572 -Qoption,cpp,--extended_float_type -Wconversion -lquadmath -L/usr/local/Cellar/gcc/10.2.0/lib/gcc/10 test.c

我是否正确使用了四精度数学函数?

另外,我尝试使用本文中描述的函数模式

libm 函数的四倍精度类似物具有 '__' 前缀(双下划线)和 'q' 后缀。”

但是,这会导致NaN所有函数都返回。

4

2 回答 2

0

我在使用带有英特尔 C++ 编译器 2021 的 Visual Studio 时遇到了类似的问题。这是一个我认为可能是 ICC 中的错误的示例。

_Quad nn = 23.1416Q;
int mm1 = (int)(double)__log10q(nn); // there is a bug in Intel 2021 compiler. need to do cast here
int mm2 = __log10q(nn);
if (mm1 != mm2) {
printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!nn = %g, mm1 = %d, mm2 = %d\n", (double)nn, mm1, mm2);
}

在 32 位版本中,它打印:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!nn = 23.1416, mm1 = 1, mm2 = 2

在 32 位调试中,它会打印:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!nn = 23.1416, mm1 = 4266, mm2 = 4267

在 64 位调试和发布中,它打印:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!nn = 23.1416, mm1 = 1, mm2 = 2

于 2021-12-14T02:45:37.167 回答
0

您需要声明函数,并且确实需要 '__' 前缀。例如:

extern "C" _Quad __logq(_Quad x) ;

这适用于 Windows。不明白为什么它不能在 Mac 上运行。

于 2021-11-19T18:00:08.900 回答