草庐IT

half-precision-float

全部标签

c++ - 物理引擎 : use double or single precision?

我正在从头开始制作一个刚体物理引擎(用于教育目的),我想知道我应该为它选择单精度还是doublefloat。我将使用OpenGL对其进行可视化,并使用glm库在引擎内部计算内容以及进行可视化。惯例似乎是在几乎所有地方都为OpenGL使用float,glm::vec3和glm::vec4似乎在内部使用float.我还注意到虽然有glm::dvec3和glm::dvec4但似乎没有人使用它。我如何决定使用哪个?double似乎很有意义,因为它具有更高的精度并且在今天的硬件上性能几乎相同(据我所知),但其他一切似乎都使用float除了一些GLu的功能和一些GLFW的。

c++ - 如何静态检查模板的类型 T 是否为 std::vector<U>,其中 U 为 float、double 或 integral

我如何检查参数包中的参数是否具有float中的任一类型?,double,integral,或std::vector其中的?例如T={int,long,std::vector}很好,同时T={int,long,std::vector}不是,因为我们不允许std::vector属于longdouble类型。我已经走到这一步了templatevoidfoo(T...t){static_assert(std::is_same::value||std::is_same::value||std::is_integral::value/*||std::is_same,T>::value?*/,"un

c++ - 2.0 和 2.0f 之间的区别(显式 float 与 double 文字)

我对将f放在文字值旁边有一些疑问。我知道它将它定义为float但我真的需要它吗?此2.0f*2.0f是否比2.0*2.0更快或编译有任何不同?像floata=2.0;这样的语句的编译方式是否与floata=2.0f;不同? 最佳答案 有时您需要它显式地具有float类型,如下例所示floatf=...;floatr=std::max(f,42.0);//won'twork;(float,double).floatr=std::max(f,42.0f);//works:bothhavesametype

c++ - float 的符号

有没有一种简单的方法可以确定float的符号?我试验并想出了这个:#includeintmain(intargc,char**argv){union{floatf;charc[4];};f=-0.0f;std::cout其中(c[3]&0x10000000)给出的值>0表示负数,但我认为这需要我做出以下假设:机器的字节是8位大float有4个字节大吗?机器的最高有效位是最左边的位(字节顺序?)如果这些假设中有任何错误或者我遗漏了任何假设,请纠正我。 最佳答案 使用math.h中的signbit()。

c++ - 如何求和大量的 float ?

我构建了一个并行求和代码来对大量float求和,然后我发现当数字的数量大于100000000时,结果会出错。然后我建立一个串行代码来比较。序列号也得到错误的数字。有人知道为什么吗?谢谢!我的简单代码如下。结果是“1.67772e+007”。应该是1e+008intmain(){size_tN=100000000;coutmyvec;vector*pvec;for(inti=0;i 最佳答案 您的问题是由于float的可用精度有限。同时1.0f+1.0f==2.0f,你会发现16777216.0f+1.0f==16777216.0f因

c++ - (float)(1.2345f * 6.7809) 是否比 1.2345f * 6.7809f 更准确?

我有一些代码块可以:floattotal=;doublesome_dbl=;total*=some_dbl;这引发了一个我想关闭的编译器警告,但我不喜欢关闭此类警告-相反,我宁愿根据需要显式转换类型。这让我开始思考......是(float)(total*some_dbl)比total*(float)some_dbl更准确吗?它是特定于编译器还是特定于平台?更好的代码示例(链接如下):#include#include#includeusingnamespacestd;intmain(){doubled_total=1.2345678;floatf_total=(float)d_tota

c++ - 启发式识别一系列 4 字节数据 block 是整数还是 float

我可以使用什么最好的启发式方法来识别X4字节block是整数还是float?人类可以轻松做到这一点,但我想以编程方式完成。我意识到,由于每个位的组合都会产生一个有效的整数,并且(几乎?)所有这些组合也会产生一个有效的float,因此无法确定。但我仍然想确定最有可能的候选人(这几乎总是正确的;或者至少,人类可以做到)。例如,我们先将一系列4字节的原始数据打印为整数,然后再打印为float:11.4013e-45101.4013e-44446.16571e-4450007.00649e-4210241.43493e-420000-5-nan111.54143e-44显然它们将是整数。现在,

c++ - 为什么 decimal128 可能会被标准化而 quad precision 不会?

这是一个非常幼稚的问题。如果我们看看C和C++标准委员会,他们目前正在致力于添加十进制浮点标准类型:linktotheCproposallinktotheC++proposal所以看起来我们可能会有一个标准化的decimal128类型,而我们还没有任何标准化的binary128类型(四精度而不是简单的扩展double)。这种情况是有技术原因还是纯粹是“政治”? 最佳答案 四精度二进制float不能替代十进制类型。精度问题仅次于十进制数的表示。这个想法是在语言中添加一种类型来支持像0.1这样的数字表示,而不会损失任何精度——这是二进制

c++ - 将两个整数相除并对结果进行四舍五入,不使用 float

我需要将两个数字相除并四舍五入。有没有更好的方法来做到这一点?intmyValue=(int)ceil((float)myIntNumber/myOtherInt);我发现必须施放两个不同的时间有点矫枉过正。(externintcast只是为了关闭警告)注意我必须在内部强制转换才能floatinta=ceil(256/11);//>Shouldbe24,butitis23^example 最佳答案 假设myIntNumber和myOtherInt都是正数,你可以这样做:intmyValue=(myIntNumber+myOtherI

c# - 为什么 List<float>.Sum() 和手动数字求和在 C# 中给出不同的结果?

在C#中,我有以下代码:publicstaticfloatsum(Listarray){floatresult=0.0f;for(inti=0;i为什么这两种“不同”方法的结果不同?对于长度为911380个元素的数组,result=620246和lSum=620235.8List.Sum的内部实现是什么?哪个答案是正确的?是C#语言/库的问题还是取决于Windows中+的实现?我们正在研究人类大脑和心脏事件,我们需要正确的结果,所以非常感谢您的帮助!非常感谢。 最佳答案 Sumextensionmethod使用double来累加结果