【问题标题】:Is long double useful in ANSI C?long double 在 ANSI C 中有用吗?
【发布时间】:2012-03-24 21:48:33
【问题描述】:

C89 (ANSI C) 标准中有一种数据类型称为long double,但没有任何数学函数支持long double (<math.h>)。例如,sin 函数接受 long 参数。

C99 支持 long double 的数学函数。

我的问题是,当 ANSI C 中没有任何数学函数支持 long double 时,long double 有用吗?

【问题讨论】:

  • +-*/ 怎么样?
  • 对于使用long double 以获得最佳效果的这类应用程序,+、-、*、/ 是不够的。
  • 对于 x86_64 浮点数,已被 SSE 取代。但是,至少对于 GCC,long double 仍然使用 x87,即使 float 和 double 使用 SSE。因此,如果有人想将 x87 用于某些代码 long double 是实现它的一种方法。使用 MSVC,long double 似乎只是 double 的同义词,因此当 double 使用 SSE 时它不会为您提供 x87。也许您的问题是:x87 仍然有用(除了兼容之外)还是 80 位浮点仍然有用?这是一个有趣的问题。

标签: math c99 c89 long-double


【解决方案1】:

是的,如果您希望计算一个超过双精度的表达式,“long double”绝对有用。

一个有趣的附带问题是“IS 'long double' 到底是什么?

答案取决于平台和/或编译器:

http://en.wikipedia.org/wiki/Long_double

【讨论】:

    【解决方案2】:

    仅仅因为 math.h 不支持某些东西并不意味着你不能自己制作。

    存在的类型是一件好事,因为它意味着有一种跨平台的方式来请求具有或多或等于 long 精度的东西。如果它不在某处的语言中,则无法做到这一点(最好的办法是用一个结构或 longs / doubles 数组来破解一些东西)。

    函数只是为了方便;有时可以使用内置的 sin 处理器函数,但有时不能,取而代之的是 sin 函数仅包含一个算法,可以使用标准操作生成答案或查找答案。

    如果需要,您可以将目标平台的 sinl 函数从 C99 复制到 C89。这里有很多实现:http://sourceware.org/git/?p=glibc.git;a=tree;f=sysdeps/ieee754;hb=HEAD

    或者只是坚持 C99。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多