Tag: math.h

将Sqrt(x)计算为x * InvSqrt(x)是否在Doom 3 BFG代码中有意义?

我浏览了最近发布的Doom 3 BFG源代码 ,当时我遇到了一些似乎没有任何意义的东西。 Doom 3将math函数包装在idMath类中。 一些函数只是从math.h获得相应的函数,但有些函数是重新实现(例如idMath :: exp16() ),我认为它们的性能要高于math.h (可能会牺牲精度)。 然而,让我感到困惑的是他们实现float idMath::Sqrt(float x)函数的方式: ID_INLINE float idMath::InvSqrt( float x ) { return ( x > FLT_SMALLEST_NON_DENORMAL ) ? sqrtf( 1.0f / x ) : INFINITY; } ID_INLINE float idMath::Sqrt( float x ) { return ( x >= 0.0f ) ? x * InvSqrt( x ) […]

日志(10.0)可以编译但日志(0.0)不能?

对于以下C源代码: #include <math.h> int main(void) { double x; x = log(0.0); return 0; } 当我用gcc -lm编译时,我得到: /tmp/ccxxANVH.o: In function `main': ac:(.text+0xd): undefined reference to `log' collect2: error: ld returned 1 exit status 但是,如果我用log(10.0)replacelog(0.0) log(10.0) ,那么它可以成功编译。 我不太明白这一点,因为无论他们是否具有math意义,他们都应该编译 – 没有语法错误。 有谁能解释这个吗? 以防万一,我的gcc -v输出: Configured with: ../src/configure -v –with-pkgversion='Ubuntu 4.8.2-19ubuntu1' –with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs –enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ –prefix=/usr –program-suffix=-4.8 –enable-shared –enable-linker-build-id –libexecdir=/usr/lib –without-included-gettext […]

什么时候使用晶圆厂,什么时候使用std :: abs就足够了?

我认为abs和fabs在使用math.h时行为是不同的。 但是当我只使用cmath和std::abs ,是否必须使用std::fabs或fabs ? 或者是不是这个定义?

atan和atan2在c ++中有什么区别?

atan和atan2在c ++中有什么区别?

为什么pow(n,2)在n = 5时返回24,使用我的编译器和操作系统?

#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int n,i,ele; n=5; ele=pow(n,2); printf("%d",ele); return 0; } 输出是24 。 我在Code :: Blocks中使用GNU / GCC。 发生什么事? 我知道pow函数返回一个double ,但25适合一个inttypes,为什么这个代码打印24而不是25 ? 如果n=4; n=6; n=3; n=2; n=4; n=6; n=3; n=2; 代码的作品,但与五不。

为什么你必须链接C中的math库?

如果在C程序中包含<stdlib.h>或<stdio.h> ,那么在编译时就不必将它们链接起来,但是我必须使用-lm和gcc链接到<math.h> ,例如: gcc test.c -o test -lm 这是什么原因? 为什么我必须明确地链接math库,而不是其他库?