草庐IT

C++浮点精度

全部标签

c++ - 乘以 float 并保持/获得 double 精度

我有一个接受float的函数,我正在用它们做一些计算,我想尽可能保持返回结果的准确性。我读到,当您将两个float相乘时,有效数字的数量就会翻倍。所以当两个float相乘时,例如floate,f;我做doubleg=e*f,位何时被截断?在我下面的示例函数中,我是否需要强制转换,如果需要,在哪里?这是一个紧密的内部循环,如果我把static_cast(x)围绕每个变量abcd在使用它的地方,我会减速5-10%。但我怀疑我不需要单独转换每个变量,而且只需要在某些位置转换,如果有的话?还是在这里返回一个double不会给我任何yield,我也可以只返回一个float?doublefunc(

c++ - 我可以期望我从文字常量设置的浮点变量值在分配给其他变量后不变吗?

如果我这样做:floata=1.5f;floatb=a;voidfunc(floatarg){if(arg==1.5f)printf("Youaretehawresome!");}func(b);文本是否每次(以及在每台机器上)打印?编辑我的意思是,即使我没有进行任何计算,我也不确定该值是否会在某个时候通过FPU,如果是这样,FPU是否会更改该值的二进制表示形式。我在某处读到,(近似)相同的浮点值在IEEE754中可以有多个二进制表示。 最佳答案 首先,1.5可以准确地存储在内存中,因此对于这个特定值,是的,它永远为真。更一般地说,

[高精度加法与动态规划混合] 数楼梯

数楼梯题目描述楼梯有NNN阶,上楼可以一步上一阶,也可以一步上二阶。编一个程序,计算共有多少种不同的走法。输入格式一个数字,楼梯数。输出格式输出走的方式总数。样例#1样例输入#15000样例输出#1627630280048895708603525310834968405547852870273645743902582444892793725681166326447588371152780625032998469024984681980064858008304010758471033268759656218507364042228679923993261579710597471085709548

c++ - 输出精度高于 double

我正在打印C++程序中的一些数据,以供ParaView处理/可视化,但我遇到了float问题。Paraview支持Float32和Float64两种数据类型。Float64相当于典型限制+/-1.7e+/-308的double。但是,我的代码正在打印像6.5e-318这样的数字。这在读取数据时会在ParaView中抛出错误。我已经验证将这些小数字四舍五入为零会使ParaView中的错误消失。我不确定为什么我有如此“高精度”的输出,可能是因为一些数字的存储精度高于double。例如,以下代码在我的系统上重现了相同的行为:#includeintmain(void){constdoublev

c++ - float 到整数的精度与 double 到整数的精度,意想不到的结果

我是计算机工程专业的学生,​​在BYU-Idaho辅导C++入门类(class),一名学生成功地难倒了我。如果为此编写代码:#includeusingnamespacestd;intmain(){floaty=.59;intx=(int)(y*100.0);cout结果=58#includeusingnamespacestd;intmain(){doubley=.59;intx=(int)(y*100.0);cout结果=59我告诉他这是一个精度问题,因为int比float更精确,所以它会丢失信息。double比float更精确,所以它可以工作。但是我不确定我说的是否正确。我认为这与用

c++ - float 精度

float在1.0f和0.0f之间有多少位精度,这样每个值都可以唯一表示?例如,如果第一个小数float不能表示0.13f,答案就是float只有一位精度。 最佳答案 std::numeric_limits::digits10来自http://en.cppreference.com/w/cpp/types/numeric_limits/digits10Thestandard32-bitIEEE754floating-pointtypehasa24bitfractionalpart(23bitswritten,oneimplied),

c++ - 应用于数组时呈现数组积分的最小正乘数

给定一个包含n个非负元素的数组,C/C++的任何库中是否有一个函数返回最小的正乘数当应用于数组的每个元素时返回一个整数?例如,如果n=2的数组是1.66667,2.33333,则乘数将为3。当我们将数组的每个元素乘以3时,我们得到5、7,都是整数。如果数组为8,10,则乘数将为0.5。这会给我们4,5。(1)boost、eigen等知名库中是否有有效的函数?(2)如果库中没有可用的东西,计算倍数的有效算法是什么? 最佳答案 在一般情况下,您的问题没有很好的解决方案,因为值以浮点格式存储,精度有限,只能存储分母的幂为2的分数。例如,0

C++17 十六进制浮点文字单精度后缀冲突?

我在查看浮点文字的C++17规范时发现了一个问题。如何区分单精度数字F和后缀F?例如,文字0x1p0F是转换为double32768.0L还是单精度1.0F?规范说后缀是可选的,没有后缀表示double,因此,如所写,存在明确的歧义。 最佳答案 十六进制float必须使用p指数。指数是使用非十六进制数字(表示要应用于2的指数的十进制整数)定义的。因此,它不能包含“A-F”字符。所以没有歧义。0x1p0F的指数为“0”,类型为float。 关于C++17十六进制浮点文字单精度后缀冲突?,我

RT-DETR算法改进:最新Inner-IoU损失函数,辅助边界框回归的IoU损失,提升RT-DETR检测器精度

💡本篇内容:RT-DETR算法改进:最新Inner-IoU损失函数,辅助边界框回归的IoU损失,提升RT-DETR检测器精度💡本博客改进源代码改进适用于RT-DETR目标检测算法(ultralytics项目版本)按步骤操作运行改进后的代码即可🚀🚀🚀💡改进RT-DETR目标检测算法专属|芒果专栏文章目录一、Inner-IoU损失函数理论部分+最新RT-DETR算法代码实践改进Inner-IoU损失函数二、RT-DETR改进Inner-IoU损失函数改进第一步改进第二步改进第三步网络配置一、Inner-IoU损失函数

javascript - 浮点表示似乎可以正确地进行整数运算——为什么?

我一直在玩弄float,根据我过去对它们的了解,0.1+0.2最终变成了类似0.30000000000000004并不让我吃惊。然而,让我感到惊讶的是,整数运算总是似乎工作得很好并且没有任何这些工件。我首先在JavaScript(node.js中的ChromeV8)中注意到了这一点:0.1+0.2==0.3//false,NOTsurprising123456789012+18==123456789030//true22334455667788+998877665544==23333333333332//true1048576/1024==1024//trueC++(MacOSX上的g