我想使用指数函数返回IEEE_FLOAT64
值
目前我正在使用expf
功能,但我仍然收到很多警告。
value = IEEEPosOne - (IEEE_FLOAT64)expf(value1);
答案 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位)。因此,如果您需要严格遵守,事情就会变得非常危险。
注意:请勿使用:
这些用于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()
可以采用任何浮点类型float
,double
或long double
并生成相应的结果类型。