草庐IT

c++ - 计算浮点 vector 的点积时,灾难性取消是一个问题吗?如果是这样,它通常是如何解决的?

我正在用C++编写一个物理模拟器,我担心它的稳健性。我读过当计算两个几乎相等数量的差异时,浮点运算中可能会发生灾难性的取消。我突然想到,当计算两个几乎正交vector的点积时,这可能会发生在模拟器中。然而,我看过的引用文献只讨论了通过重写相关方程来解决问题(例如,可以重写二次公式以消除问题)——但这在计算点积时似乎并不适用?我想我很想知道这是否通常是物理引擎中的一个问题以及如何解决它。 最佳答案 一个常见的技巧是使累加器变量成为比vector本身具有更高精度的类型。或者,可以使用Kahansummation总结条款时。另一种方法是使

c++ - 计算浮点 vector 的点积时,灾难性取消是一个问题吗?如果是这样,它通常是如何解决的?

我正在用C++编写一个物理模拟器,我担心它的稳健性。我读过当计算两个几乎相等数量的差异时,浮点运算中可能会发生灾难性的取消。我突然想到,当计算两个几乎正交vector的点积时,这可能会发生在模拟器中。然而,我看过的引用文献只讨论了通过重写相关方程来解决问题(例如,可以重写二次公式以消除问题)——但这在计算点积时似乎并不适用?我想我很想知道这是否通常是物理引擎中的一个问题以及如何解决它。 最佳答案 一个常见的技巧是使累加器变量成为比vector本身具有更高精度的类型。或者,可以使用Kahansummation总结条款时。另一种方法是使

c++ - std::hash_set vs std::unordered_set,它们是一回事吗?

我知道hash_set是非标准的,而unordered_set是标准的。但是,我想知道,性能方面,两者之间有什么区别?为什么要分开存在? 最佳答案 C++标准规定的unordered_容器的复杂性要求基本上没有为实现留下太多空间,它必须是某种哈希表。该标准是在充分意识到大多数供应商已经将这些数据结构作为扩展部署的情况下编写的。编译器供应商通常将这些容器称为“HashMap”或“哈希集”,这可能是您所指的(标准中没有文字std::hash_set,但是我认为GCC在单独的命名空间中有一个,对于其他编译器也是如此)。编写新标准时,作者希

c++ - std::hash_set vs std::unordered_set,它们是一回事吗?

我知道hash_set是非标准的,而unordered_set是标准的。但是,我想知道,性能方面,两者之间有什么区别?为什么要分开存在? 最佳答案 C++标准规定的unordered_容器的复杂性要求基本上没有为实现留下太多空间,它必须是某种哈希表。该标准是在充分意识到大多数供应商已经将这些数据结构作为扩展部署的情况下编写的。编译器供应商通常将这些容器称为“HashMap”或“哈希集”,这可能是您所指的(标准中没有文字std::hash_set,但是我认为GCC在单独的命名空间中有一个,对于其他编译器也是如此)。编写新标准时,作者希

c++ - 为什么这不是一个常量表达式?

在这个简单的示例中,即使test1成功,test2也无法编译,我不明白为什么会这样。如果arr[i]适用于标记为constexpr的函数的返回值,那么为什么不能将其用作非类型模板参数?templatestructt{staticconstcharvalue=c;};templateconstexprchartest1(constchar(&arr)[N],unsignedi){returnarr[i];}templateconstexprchartest2(constchar(&arr)[N],unsignedi){returnt::value;}intmain(){chara=tes

c++ - 为什么这不是一个常量表达式?

在这个简单的示例中,即使test1成功,test2也无法编译,我不明白为什么会这样。如果arr[i]适用于标记为constexpr的函数的返回值,那么为什么不能将其用作非类型模板参数?templatestructt{staticconstcharvalue=c;};templateconstexprchartest1(constchar(&arr)[N],unsignedi){returnarr[i];}templateconstexprchartest2(constchar(&arr)[N],unsignedi){returnt::value;}intmain(){chara=tes

c++ - 鉴于 p 是一个指针是 "p > nullptr"格式正确吗?

给定一个指针p:char*p;//Couldbeanytype假设p已正确初始化,则格式如下:if(p>0)//orp>nullptr更一般地说,当一个操作数是指针而另一个操作数是空指针常量时,使用关系运算符是否格式正确? 最佳答案 在C++14中,此代码格式错误,但在C++14之前,此代码格式正确(但结果未指定),如defectreport583:Relationalpointercomparisonsagainstthenullpointerconstant备注:InC,thisisill-formed(cfC996.5.8):

c++ - 鉴于 p 是一个指针是 "p > nullptr"格式正确吗?

给定一个指针p:char*p;//Couldbeanytype假设p已正确初始化,则格式如下:if(p>0)//orp>nullptr更一般地说,当一个操作数是指针而另一个操作数是空指针常量时,使用关系运算符是否格式正确? 最佳答案 在C++14中,此代码格式错误,但在C++14之前,此代码格式正确(但结果未指定),如defectreport583:Relationalpointercomparisonsagainstthenullpointerconstant备注:InC,thisisill-formed(cfC996.5.8):

c++ - 通过参数返回值是一个好的设计吗?

boolis_something_ok(intparam,SomeStruct*p){boolis_ok=false;//checkifis_okif(is_ok)//setptosomevalidvalueelse//setptoNULLreturnis_ok;}如果“一切正常”,此函数返回true并将p设置为有效值否则返回false并将p设置为NULL这是一个好还是坏的设计?个人,我在使用时感到不舒服。如果没有文档和评论,我真的不知道怎么用。顺便说一句:有没有关于API设计的权威书籍/文章? 最佳答案 由于您已将问题标记为C++

c++ - 通过参数返回值是一个好的设计吗?

boolis_something_ok(intparam,SomeStruct*p){boolis_ok=false;//checkifis_okif(is_ok)//setptosomevalidvalueelse//setptoNULLreturnis_ok;}如果“一切正常”,此函数返回true并将p设置为有效值否则返回false并将p设置为NULL这是一个好还是坏的设计?个人,我在使用时感到不舒服。如果没有文档和评论,我真的不知道怎么用。顺便说一句:有没有关于API设计的权威书籍/文章? 最佳答案 由于您已将问题标记为C++