是否有任何指数函数在math.h头中返回IEEE_FLOAT64?

时间:2018-04-11 03:56:44

标签: c++ c math

我想使用指数函数返回IEEE_FLOAT64

目前我正在使用expf功能,但我仍然收到很多警告。

value = IEEEPosOne - (IEEE_FLOAT64)expf(value1);

3 个答案:

答案 0 :(得分:1)

来自man 3 exp

NAME
       exp, expf, expl - base-e exponential function

SYNOPSIS
       #include <math.h>

       double exp(double x);
       float expf(float x);
       long double expl(long double x);

       Link with -lm.

所以只需使用exp()

答案 1 :(得分:1)

//c++
#include <cmath>
double x = 7.0;//float64
auto y = std::exp(x);//exp(float64);

C ++标准提供了适当的重载。无需在函数名称中反映操作数类型。

答案 2 :(得分:0)

这个答案不适用于仅适用于C ++的C. 对于C,请参阅@ iBug的回答。

C ++标准不要求实现使用IEEE标准。虽然这通常是最简单的浮点实现,因为芯片在现代机器中是相对标准的。

该标准提供了一种使用std::numeric_limits进行检查的方法。

因此,如果需要,则应进行验证。

#include <limits>
#include <iostream>

int main()
{
    static_assert(sizeof(double) == 64);
    static_assert(std::numeric_limits<double>::is_iec559());

    // If the above compiles your double is IEEE 64 bit value.
    // Or IEEE_754 compliant https://en.wikipedia.org/wiki/IEEE_754_revision
}

现在您已经建立了使用IEEE值的标准,您可以查看cmath标题,看看那里的函数都采用并返回一个double值。

注意:您应该注意Windows机器(通常)使用80位浮点寄存器(而不是64位)。因此,如果您需要严格遵守,事情就会变得非常危险。

注意:请勿使用

  • expf()for float,
  • expl()for long double

这些用于C库用户,其中语言没有进行正确的类型检查。在C ++中,语言使用重载来使用正确的函数版本。如果您查看exp的标准:

在标题&lt; cmath&gt;

中定义
* float       exp( float arg );
* double      exp( double arg );
* long double exp( long double arg );
* double      exp( Integral arg );

以上都在标准命名空间中。

std::cout << std::exp(100000.1) << "\n";

请注意,exp()可以采用任何浮点类型floatdoublelong double并生成相应的结果类型。