浮点数是32个二进制数字,双数字是64个二进制数字吗?文档太难理解了.
所有位都转换为有效数字?或者小数点的位置是否占用了一些位?
从这个页面中可以看出,c ++ 11中的数学函数似乎都没有使用constexpr,而我相信所有这些函数都可以.所以这给我留下两个问题,一个是他们为什么选择不使函数constexpr.对于像sqrt我这样的函数来说,两个人可能会编写我自己的constexpr,但是像sin或cos这样的东西会比较棘手,所以它就在那里.
C++ 14将允许创建模板化的变量.通常的例子是变量'pi',可以读取它以获得各种类型的数学常数π的值(3表示int;可能的最接近的值float等)
除此之外,我们可以通过将变量包装在模板化的结构或类中来实现此功能,这与类型转换如何混合?我看到一些重叠.
除了pi示例之外,它如何与非const变量一起使用?任何用法示例,以了解如何充分利用此类功能及其目的是什么?
我可以在头文件中有这样的定义吗?
constexpr double PI=3.14;
Run Code Online (Sandbox Code Playgroud)
在包含在几个cpp文件中的头文件中有这个问题吗?
我担心,因为它在标准中说这个constexpr有自己的内存,把它放在头文件中,并在几个cpp文件中添加标题,在内存中生成相同值的多个副本以及其他一些令人讨厌的问题.
我正在使用C++ 11
我正在学习bash脚本.在探索数学函数时,我遇到了一个计算pi值的命令.
seq -f '4/%g' 1 2 99999 | paste -sd-+ | bc -l
Run Code Online (Sandbox Code Playgroud)
虽然我理解基本的seq命令是如何工作的,但我无法理解上述命令是如何工作的.任何人都可以澄清它是如何工作的.
我观察到库中的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/C++中使用数字e的更"自然"的方法.我专注于计算函数e ^ n.
我认为'cmath',默认情况下,不支持(函数和常量).但是,它可以包含编译器定义的常量,在本例中M_E.这可以通过包含声明来完成#define _USE_MATH_DEFINES.
另一方面,e可以定义为常数:
#define E 2.71828182845904523536;
Run Code Online (Sandbox Code Playgroud)
要么
const double EULER = 2.71828182845904523536;
Run Code Online (Sandbox Code Playgroud)
说这个.哪一个是接近这个数学常数的最"标准"方法?是其他图书馆吗?
有人告诉我:
在x86-64下,FP算法使用SSE完成,因此long double是64位.
但是在x86-64 ABI中它说:
C type | sizeof | alignment | AMD64 Architecture
long double | 16 | 16 | 80-bit extended (IEEE-754)
Run Code Online (Sandbox Code Playgroud)
和gcc说sizeof(long double)是16并给出FLT_DBL= 1.79769e+308和FLT_LDBL = 1.18973e+4932
所以我很困惑,long double64位是怎么回事?我认为这是一个80位的表示.
考虑下面两个非常简单的乘法:
double result1;
long double result2;
float var1=3.1;
float var2=6.789;
double var3=87.45;
double var4=234.987;
result1=var1*var2;
result2=var3*var4;
Run Code Online (Sandbox Code Playgroud)
默认情况下,乘法是否以高于操作数的精度完成?我的意思是,在第一次乘法的情况下,它是以双精度完成的,如果在x86架构中第二次,它是以80位扩展精度完成的,或者我们应该在表达式中将操作数转换为更高的精度,如下所示?
result1=(double)var1*(double)var2;
result2=(long double)var3*(long double)var4;
Run Code Online (Sandbox Code Playgroud)
其他操作(添加,除法和余数)怎么样?例如,当添加两个以上的正单精度值时,如果用于保存表达式的中间结果,则使用双精度的额外有效位可以减少舍入误差.
c++ floating-point arithmetic-expressions rounding floating-point-precision
我想尝试将项目从gcc迁移到clang ++.我承认我的无知,我不知道为什么以下的代码
template <typename T>
constexpr T pi{std::acos(T(-1.0))};
Run Code Online (Sandbox Code Playgroud)
使用g ++静默编译但clang ++产生错误
trig.hpp:3:13: error: constexpr variable 'pi<float>' must be initialized by a constant expression
constexpr T pi{std::acos(T(-1.0))};
Run Code Online (Sandbox Code Playgroud)
而且我希望有人比我更了解它,可以启发我.
注意:尝试使用-std = C++ 14和C++ 1y.在clang版本3.6.2(标签/ RELEASE_362/final)下失败.适用于g ++(GCC)5.2.0.