我这里有它使用一个小的测试应用程序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种不同标准构建和运行:
Run Code Online (Sandbox Code Playgroud)$ 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
现在我们还包括<cmath>,并测试两者isnan和std::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)$ …
我正在尝试计算log a b(并获得一个浮点,而不是一个整数).我打算这样做log(b)/log(a).从数学上讲,我可以使用任何cmath日志函数(基数2,e或10)来进行此计算; 但是,我会在我的程序中运行这个计算很多,所以我想知道其中一个是否比其他程序快得多(或者更好的是,如果有更快,但仍然很简单的方法).如果重要,a和b都是整数.
测试代码:
#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) 我在这里检查了abs和fabspython 之间的区别
据我所知,速度和传递的类型有一些不同,但我的问题与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=-9为i=-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) 鉴于以下计划:
#include <cmath>
int main()
{
std::abs(0u) ;
}
Run Code Online (Sandbox Code Playgroud)
gcc并且clang不同意这是否是不正确的.使用gcc与libstdc++代码建立无错误或警告(见直播),同时采用clang与libc++它生成以下错误(见直播):
error: call to 'abs' is ambiguous
std::abs(0u) ;
^~~~~~~~
Run Code Online (Sandbox Code Playgroud)
哪个结果是正确的?应该abs(0u)是暧昧与否?
MSalters指出了一个有趣的相关问题:std :: abs的模板版本.
在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语句)
我观察到库中的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)
有人可以帮助我,因为我看到了负值吗?它与某些浮点大小错误有关吗?或者我做的事情真的很蠢?
我曾经没有任何问题地使用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>.
怎么解决这个问题?
我试图允许我的程序分别上下舍入一个数字.
例如,如果数字是3.6,我的程序假设将最接近的数字3.4四舍五入,如果是数字,则将其向下舍入为3.
我尝试使用该ceil库来获得3个项目的平均值.
results = ceil((marks1 + marks2 + marks3)/3)
然而,ceil唯一的一轮数量下降,但没有滚动数字.
我偶然发现了一种算法
var roundedVal = Math.round(origVal*20)/20;
但我仍然无法找出某个问题的公式.
我很惊讶表示安静的NaN值的C++工具的数量.我发现了三种标准方式:
std::numeric_limits<T>::quiet_NaN() - 通用,我认为这是被选中的std::nan,std::nanf,std::nanl-家庭的接收功能const char*参数NAN - 一个宏,"评估为一个安静的非数字"其中每一个都是在C++ 11中引入的.我有几个问题:
const char*争论代表什么std::nan和合作?如何使用?cmath ×10
c++ ×7
c++11 ×3
c ×2
nan ×2
trigonometry ×2
android ×1
android-ndk ×1
c++14 ×1
ceil ×1
logarithm ×1
math ×1
math.h ×1
performance ×1
visual-c++ ×1