草庐IT

浮点数

全部标签

c++ - constexpr:浮点表示错误?

我希望将常量从度数转换为弧度(在编译时),所以我选择使用constexpr。但是,我的程序无法编译,因此我尝试通过一些测试来调试问题。这些测试在编译期间继续产生错误。当涉及许多有效数字时,问题似乎与浮点运算相关。我尝试了快速谷歌搜索,并阅读了Stroustrup书中的第10.4节(常量表达式)。任何帮助将不胜感激。我一定遗漏了一些明显的东西。测试代码:voidtestConstantExpressions(){constexprdoublex0=1.0;constexprdoubley0=2.0;constexprdoublez0=4.0;constexprdoublew0=x0/(y

c++ - C++ 中是否允许浮点表达式收缩?

浮点表达式有时可以在处理硬件上收缩,例如使用融合乘加作为单个硬件操作。显然,使用这些this不仅仅是一个实现细节,还受编程语言规范的约束。具体来说,C89标准不允许这样的缩略,而在C99中,只要定义了一些宏,它们是允许的。详见thisSOanswer.但是C++呢?是否不允许浮点收缩?某些标准允许吗?普遍允许? 最佳答案 总结收缩是允许的,但为用户提供了一个工具来禁用它们。标准中不明确的语言笼罩了禁用它们是否会提供预期结果的问题。我在官方C++2003标准和2017n4659草案中对此进行了调查。除非另有说明,否则C++引文均来自2

c++ - Jsoncpp 错误地写入浮点值

我正在使用jsoncpp读取JSON文件。当我写回文件时,我的浮点值略有偏差。为了进行测试,我决定将文件解析为Json::Value,然后将该值写回到文件中。我希望它看起来一样,但浮点值不同。例子:"Parameters":{"MinXValue":0.1,"MaxXValue":0.15,"MinYValue":0.25,"MaxYValue":1.1,"MinObjectSizeValue":1}写成:"Parameters":{"MinXValue":0.10000000000000001,"MaxXValue":0.14999999999999999,"MinYValue":0

c++ - 浮点值加倍和除法

我有一个函数,我相信它会将一个int转换为一个浮点值,并将其拆分为该值的符号指数和小数部分。使用IEEE754表示浮点值。unsignedtest(unsignedx){//splitthegivenbitsofsignexponentandfraction,combinetoreturnunsignedintsign=(x&0x80000000)>>31;unsignedintexpo=(x&0x7F800000)>>23;unsignedintfrac=(x&0x007fffff);return(sign但是我不确定如何从这个浮点表示中计算出减半或加倍的值。unsigneddoub

c++ - 在 C++ 中进行数学运算时,浮点错误如何传播?

假设我们声明了以下变量floata=1.2291;floatb=3.99;float变量的精度为6,这(如果我理解正确的话)意味着计算机实际存储的数字与您想要的实际数字之间的差异将小于10^-6这意味着a和b都有一些小于10^-6的误差所以在计算机内部a实际上可能是1.229100000012123而b可能是3.9900000191919现在假设您有以下代码floatc=0;for(inti=0;i我的问题是,c的最终结果是否也会有小于10^-6的精度误差?如果答案是否定的,我们如何才能真正知道这个精度误差,以及如果您应用任何类型的操作,按您希望的次数和以任何顺序到底会发生什么?

c++ - 浮点乘积扩展等价

在IEEE754float中,有可能a*(b-c)!=a*b-a*c//a,b,cdouble因此不能保证展开的产品与未展开的产品相等。但是这个呢:a*(b1+b2+...+bn)==a*b1+a*b2+...+a*bn//b1==b2==...==bn当所有b相等时,是否保证等价(在没有下溢/上溢的情况下)?如果b的相等性在编译时是否已知,是否有区别?编辑:它不是-参见EricPostpischil和PascalCuoq。但也许持有较弱的断言?:(1.0/n)*(b1+b2+...+bn)我只是想知道您是否可以保证数据集的平均值不超过某个值每个数据值也不超过,无论您如何计算平均值(先

c++ - 如何测试文件存储的浮点表示?

这个问题在这里已经有了答案:HowtocheckifC++compilerusesIEEE754floatingpointstandard(2个答案)关闭7年前。我已将科学数据转储到文件中。目前,我只是用与内存中相同的表示形式丢弃了它们。我已经记录了它们是IEEE754,但我希望在代码中声明这一点,这样如果它被移植到一个奇怪的架构并与我的文档分开(研究代码被传递)它会在编译时出错。目前我有static_assert(sizeof(double)==8),"message");有没有办法测试IEEE754?可以静态断言吗?

c++ - 高效的浮点比较(Cortex-A8)

有一个很大(~100000)的浮点点变量数组,并且有一个阈值(也是浮点点)。问题是我必须将数组中的每个变量与阈值进行比较,但NEON标志传输需要很长时间(根据分析器,大约20个周期)。是否有任何有效的方法来比较这些值?注意:由于舍入误差无关紧要,我尝试了以下操作:floatarr[10000];floatthreshold;....inta=arr[20];//e.g.intt=threshold;if(t>a){....}但在这种情况下,我得到以下处理器命令序列:vldr.32s0,[r0]vcvt.s32.f32s0,s0vmovr0,s0由于转换发生在NEON上,因此无论我是通过

c++ - 没有将 bool 隐式转换为浮点类型的警告?

看起来这个片段在clang中编译时没有警告,即使使用了-Weverything:doublex;...if(fabs(x>1.0)){...}我错过了什么吗?还是编译器和C++标准认为将bool转换为double是有意义的? 最佳答案 这是使bool成为整数类型的结果。根据C++标准,第3.9.1.6节Valuesoftypeboolareeithertrueorfalse(Note:Therearenosigned,unsigned,short,orlongbooltypesorvalues.—endnote)Valuesofty

c++ - 为什么在 C++17 中使用十六进制浮点常量?

C++17添加十六进制浮点常量(floatingpointliteral)。为什么?举几个例子来说明好处如何。 最佳答案 float以2为基数存储在x86/x64处理器中,而不是以10为基数:https://en.wikipedia.org/wiki/Double-precision_floating-point_format.由于无法准确表示许多十进制float,例如十进制0.1可以表示为0.1000000000000003或0.0999999999999997-任何具有足够接近十进制0.1的基数2表示形式。由于这种不精确性,例如