草庐IT

c++ - IEEE-754 浮点计算、相等和缩小

在下面的代码中,函数foo1、foo2和foo3是等价的。然而,当runfoo3没有从循环中终止时,是否存在这种情况的原因?templateTfoo1(){Tx=T(1);Ty=T(0);for(;;){if(x==y)break;y=x;++x;}returnx;}templateTfoo2(){Tx=T(0);for(;;){Ty=x+T(1);if(!(x!=y))break;++x;}returnx;}templateTfoo3(){Tx=T(0);while(x!=(x+T(1)))++x;returnx;}intmain(){printf("1float:%20.5f\n"

c++ - SSE减少浮点 vector

如何使用sse内在函数获取浮点vector的总和元素(减少)?简单的串口代码:void(float*input,float&result,unsignedintNumElems){result=0;for(autoi=0;i 最佳答案 通常您会在循环中生成4个部分和,然后在循环后对4个元素进行水平求和,例如#include#include#includefloatvsum(constfloat*a,intn){floatsum;__m128vsum=_mm_set1_ps(0.0f);assert((n&3)==0);assert(

c++ - 如何在 C++ 中编写可移植的浮点运算?

假设您正在编写一个执行大量浮点运算的C++应用程序。假设此应用程序需要在合理范围内的硬件和操作系统平台(例如32位和64位硬件、32位和64位版本的Windows和Linux...)之间具有可移植性。您如何确保您的浮点算法在所有平台上都相同?例如,如何确保32位浮点值在所有平台上都真正是32位?对于整数,我们有stdint.h但似乎不存在等效的float。[编辑]我得到了非常有趣的答案,但我想为这个问题增加一些精确度。对于整数,我可以这样写:#include[...]int32_tmyInt;并确保无论我使用何种(C99兼容)平台,myInt都是32位整数。如果我写:doublemyD

c++ - C和C++中的浮点运算差异

Closed.Thisquestionneedsdebuggingdetails。它当前不接受答案。想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。2年前关闭。Improvethisquestion解决方案感谢@MichaelVeksler的回答,我处于正确的位置以寻找解决方案。在此post中,@Christoph建议尝试使用不同的编译器标志来设置浮点运算的精度。对我来说,-mpc32标志解决了这个问题。我必须将C++代码转换为C代码,因为新目标将没有C++编译器。我遇到了一件奇怪的事情,在C程序中运行时,与在C++程序中运行时,数学方程式给出不同的结果。方程:f

c++ - 模板化代码中的浮点常量

我有一个对浮点参数进行操作的模板函数。该函数是模板化的,因此调用者可以使用float、double或任何其他float据类型。在我的代码中的某一点,我将一个值与零(或任何其他浮点常量)进行比较。我应该使用0.0还是0.0f进行比较?templatevoidf(Ta){//shouldIuse0.0or0.0finthefollowingline?if(a==0.0){}}虽然目前这不会造成任何问题,但我想知道通常的做法是什么。 最佳答案 我建议if(a==T(0))... 关于c++-模

c++ - 带大括号的 double 浮点初始化

为什么编译器(clang,gcc)在执行此操作时不警告缩小转换floata{3.1231231241234123512354123512341235123541235};floata={double(3.1231231241234123512354123512341235123541235)}我预计会收到警告,因为我使用大括号进行了显式值初始化。按照这个答案Link它应该吐出一个错误。Compilationhere 最佳答案 [dcl.init.list]/§7(标准草案)Anarrowingconversionisanimplic

c# - 浮点加法 : loss-of-precision issues

简而言之:我如何执行a+b以便截断导致的任何精度损失远离零而不是接近零?长话短说我正在计算一长串浮点值的总和,目的是计算集合的样本均值和方差。由于Var(X)=E(X2)-E(X)2,足以维持所有数字的运行计数,即到目前为止所有数字的总和,以及到目前为止所有数字的平方和。到目前为止一切顺利。但是,绝对需要E(X2)>E(X)2,因为浮点精度不是情况总是如此。在伪代码中,问题是这样的:intcount;doublesum,sumOfSquares;...doublevalue=;doublesqrVal=value*value;count++;sum+=value;//slightlyr

c++ - 解决浮点舍入问题 C++

我开发了一个科学应用程序(模拟染色体在细胞核中的移动)。染色体被分成小片段,使用4x4旋转矩阵围绕随机轴旋转。问题在于模拟执行了数千亿次旋转,因此浮点舍入误差会叠加并呈指数增长,因此随着时间的推移,片段往往会“漂浮”并与染色体的其余部分分离。我在C++中使用double。该软件目前在CPU上运行,但将移植到CUDA,最多模拟1个月。我不知道如何以某种方式重新规范化染色体,因为所有片段都链接在一起(您可以将其视为双向链表),但我认为这是最好的主意,如果可能的话。你有什么建议吗?我觉得有点失落。非常感谢,H.编辑:添加了简化的示例代码。您可以假设所有矩阵数学都是经典实现。//Rotate1

c++ - 不,真的,浮点提升什么时候发生?

从这个其他QUESTION他们谈论BjarneStroustrup是如何说的,就像比int窄的整数数据类型(例如short)被提升为int,float被提升为double。但是,与int窄的积分扩展不同,浮点提升不会以相同的方式发生,而是发生在其他地方。我知道如果你要计算float+doublefloat会在二元运算符(+)被应用。但是,根据Learncpp.com,这不是浮点提升.这是通常的算术转换。浮点提升何时真正发生? 最佳答案 float有“float提升”之类的东西。至double根据[conv.fpprom]。Aprva

c++ - 浮点加法和乘法是关联的吗?

我在添加三个浮点值并将它们与1进行比较时遇到了问题。cout为什么这些值会不同? 最佳答案 浮点加法不一定是关联的。如果您更改相加的顺序,这可能会改变结果。关于该主题的标准论文是WhatEveryComputerScientistShouldKnowaboutFloatingPointArithmetic.它给出了以下示例:Anothergreyareaconcernstheinterpretationofparentheses.Duetoroundofferrors,theassociativelawsofalgebradonot