标签: cmath

<cmath>隐藏了C++ 14/C++ 11中<math.h>中的isnan?

我这里有它使用一个小的测试应用程序isnan<math.h>:

#include <iostream>
#include <math.h>

int main()
{
    double d = NAN;

    std::cout << isnan(d) << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据3种不同标准构建和运行:

$ g++ -std=c++98 main.cpp; ./a.out
1

$ g++ -std=c++11 main.cpp; ./a.out
1

$ g++ -std=c++14 main.cpp; ./a.out
1
Run Code Online (Sandbox Code Playgroud)

现在我们还包括<cmath>,并测试两者isnanstd::isnan:

#include <iostream>
#include <cmath>
#include <math.h>

int main()
{
    double d = NAN;

    std::cout << std::isnan(d) << '\n';
    std::cout << isnan(d) << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

构建并运行:

C++ 98可以工作

$ …
Run Code Online (Sandbox Code Playgroud)

c++ nan cmath c++11 c++14

21
推荐指数
2
解决办法
3380
查看次数

C/C++最快的cmath日志操作

我正在尝试计算log a b(并获得一个浮点,而不是一个整数).我打算这样做log(b)/log(a).从数学上讲,我可以使用任何cmath日志函数(基数2,e或10)来进行此计算; 但是,我会在我的程序中运行这个计算很多,所以我想知道其中一个是否比其他程序快得多(或者更好的是,如果有更快,但仍然很简单的方法).如果重要,a和b都是整数.

c c++ logarithm math.h cmath

20
推荐指数
2
解决办法
9431
查看次数

为什么std :: sin()和std :: cos()比sin()和cos()慢?

测试代码:

#include <cmath>
#include <cstdio>

const int N = 4096;
const float PI = 3.1415926535897932384626;

float cosine[N][N];
float sine[N][N];

int main() {
    printf("a\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cosine[i][j] = cos(i*j*2*PI/N);
            sine[i][j] = sin(-i*j*2*PI/N);
        }
    }
    printf("b\n");
}
Run Code Online (Sandbox Code Playgroud)

这是时间:

$ g++ main.cc -o main
$ time ./main
a
b

real    0m1.406s
user    0m1.370s
sys     0m0.030s
Run Code Online (Sandbox Code Playgroud)

添加后using namespace std;,时间是:

$ g++ main.cc -o main …
Run Code Online (Sandbox Code Playgroud)

c++ performance trigonometry cmath

20
推荐指数
2
解决办法
7621
查看次数

abs和fabs有什么区别?

我在这里检查了absfabspython 之间的区别

据我所知,速度和传递的类型有一些不同,但我的问题与VS上的原生c ++有关

关于VS我尝试了以下内容Visual Studio 2013 (v120):

float f1= abs(-9.2); // f = 9.2
float f2= fabs(-9); // Compile error [*]
Run Code Online (Sandbox Code Playgroud)

所以fabs(-9)它会给我一个编译器错误,但是当我尝试执行以下操作时:

double i = -9;
float f2= fabs(i); // This will work fine
Run Code Online (Sandbox Code Playgroud)

我从第一个代码中理解它不会编译因为fabs(-9)需要一个double,并且编译器无法将-9转换为-9.0,但在第二个代码中编译器将在编译时转换i=-9i=-9.0所以fabs(i)将正常工作.

有更好的解释吗?

另一件事,为什么编译器不能fabs(-9)像在c#中那样自动接受 并将int值转换为double?

[*]:

Error: more than one instance of overloaded function "fabs" matches the argument list:
        function "fabs(double _X)"
        function "fabs(float _X)"
        function …
Run Code Online (Sandbox Code Playgroud)

c++ cmath visual-studio-2013

18
推荐指数
2
解决办法
2万
查看次数

std :: abs(0u)是不是形成了?

鉴于以下计划:

#include <cmath>

int main()
{
    std::abs(0u) ;
}
Run Code Online (Sandbox Code Playgroud)

gcc并且clang不同意这是否是不正确的.使用gcclibstdc++代码建立无错误或警告(见直播),同时采用clanglibc++它生成以下错误(见直播):

error: call to 'abs' is ambiguous
std::abs(0u) ;
^~~~~~~~
Run Code Online (Sandbox Code Playgroud)

哪个结果是正确的?应该abs(0u)是暧昧与否?


MSalters指出了一个有趣的相关问题:std :: abs的模板版本.

c++ cmath language-lawyer c++11

16
推荐指数
1
解决办法
1971
查看次数

我怎样才能解决在C++中sin(M_PI)不为0的事实?

在C++中,

const double Pi = 3.14159265;
cout << sin(Pi);                          // displays: 3.58979e-009
Run Code Online (Sandbox Code Playgroud)

它应该显示数字零

我明白这是因为Pi是近似的,但是有没有什么方法可以让Pi硬编码到我的程序中,为sin(Pi)返回0?(可能是一个不同的常数?)

如果你想知道我想要做什么:我将极性转换为矩形,虽然有一些printf()技巧我可以做到打印为"0.00",它仍然不会一直返回正常值(在某些情况下,我得到"-0.00")

需要sin和余弦的线是:

x = r*sin(theta);
y = r*cos(theta);
Run Code Online (Sandbox Code Playgroud)

BTW:我的矩形 - > Polar工作得很好......它只是Polar - > Rectangular

谢谢!

编辑: 我正在寻找一个解决方法,以便我可以打印罪(Pi的一些倍数)作为一个很好的圆数到控制台(理想情况下没有一千个if语句)

c++ trigonometry cmath

14
推荐指数
2
解决办法
8476
查看次数

在C中,tan(30)给出了负值!为什么?

我观察到库中的tan(float)函数cmath返回负值.

以下代码,运行时:

    #include <cmath>
    ....

    // some calculation here gives me a value between 0.0 to 1.0.
    float tempSpeed = 0.5; 

    float tanValue = tan(tempSpeed * 60);

    __android_log_print(ANDROID_LOG_INFO, "Log Me", "speed: %f", tanValue);
Run Code Online (Sandbox Code Playgroud)

在我的日志文件中给我这个结果:

    Log Me: speed `-6.4053311966`
Run Code Online (Sandbox Code Playgroud)

就目前我所记得的

    tan(0.5*60) = tan(30) = 1/squareroot(3);
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我,因为我看到了负值吗?它与某些浮点大小错误有关吗?或者我做的事情真的很蠢?

c math android cmath android-ndk

13
推荐指数
2
解决办法
6069
查看次数

cmath.h并编译错误

我曾经没有任何问题地使用math.h.现在,我使用一个外部库,它本身有一个名为的文件math.h,但包括< cmath>.

将此库添加到我的项目中(甚至只是添加include目录,而不触及代码)现在会产生大量错误< cmath>:

C:\ Program Files\Microsoft Visual Studio 8\VC\include\cmath(18):错误C2039:'acosf':不是'`global namespace''的成员

C:\ Program Files\Microsoft Visual Studio 8\VC\include\cmath(18):错误C2873:'acosf':符号不能在using声明中使用

C:\ Program Files\Microsoft Visual Studio 8\VC\include\cmath(18):错误C2039:'asinf':不是'`global namespace''的成员

C:\ Program Files\Microsoft Visual Studio 8\VC\include\cmath(18):错误C2873:'asinf':符号不能在using声明中使用

[等等...]

我不明白为什么会这样.我正在使用Visual Studio 2005并在互联网上查看,似乎这个问题在VS 2008下得到了解决.但是,我想留在VS 2005 ...

包括using namespace std;无处不在,或改变我的包含顺序似乎没有任何改变.定义_STD_BEGIN解决了错误,但产生了多少< xlocinfo>.

怎么解决这个问题?

compiler-errors cmath visual-studio visual-c++

11
推荐指数
2
解决办法
2万
查看次数

向上和向下舍入数字C++

我试图允许我的程序分别上下舍入一个数字.

例如,如果数字是3.6,我的程序假设将最接近的数字3.4四舍五入,如果是数字,则将其向下舍入为3.

我尝试使用该ceil库来获得3个项目的平均值.

results = ceil((marks1 + marks2 + marks3)/3)

然而,ceil唯一的一轮数量下降,但没有滚动数字.

我偶然发现了一种算法

var roundedVal = Math.round(origVal*20)/20;

但我仍然无法找出某个问题的公式.

c++ cmath ceil

11
推荐指数
4
解决办法
3万
查看次数

std :: numeric_limits :: quiet_NaN()与std :: nan()vs. NAN

我很惊讶表示安静的NaN值的C++工具的数量.我发现了三种标准方式:

  1. std::numeric_limits<T>::quiet_NaN() - 通用,我认为这是被选中的
  2. std::nan,std::nanf,std::nanl-家庭的接收功能const char*参数
  3. NAN - 一个宏,"评估为一个安静的非数字"

其中每一个都是在C++ 11中引入的.我有几个问题:

  1. const char*争论代表什么std::nan和合作?如何使用?
  2. 为什么我们需要在C++ 11中添加,而我们已经为此目的添加了一个通用特征类?(是否与C兼容?)
  3. 我应该默认使用的是什么?(我想这是第一次)

floating-point nan cmath c++11

11
推荐指数
1
解决办法
4306
查看次数