glm::vec3 精度 C++

Posted

技术标签:

【中文标题】glm::vec3 精度 C++【英文标题】:glm::vec3 precision C++ 【发布时间】:2014-10-31 20:37:24 【问题描述】:

我正在使用 glm 库在 C++ 中创建一个碰撞检测系统。

我有一个定义为std::vector<glm::vec3> vertices 的顶点数组和一个计算maxX、y、z 定义为的函数

GLfloat AssetInstance::maxX()

    GLfloat max = vertices.at(0).x;

    for(glm::vec3 vertex : vertices)
        if(vertex.x > max) max = vertex.x;

    return max;

但如果我运行以下代码:

std::vector<glm::vec3> testVector;
testVector.push_back(glm::vec3(3.0500346, 1.0, 1.0));
testVector.push_back(glm::vec3(3.0500344, 2.0, 2.0));
testVector.push_back(glm::vec3(3.0500343, 3.0, 3.0));

std::cout << maxX(testVector) << std::endl;

输出为 3.05003

我认为glm::vec3doubledouble 比这更精确? 有一个更好的方法吗?我的 maxX 没有返回足够精确的结果。

【问题讨论】:

【参考方案1】:

试试setprecision。默认情况下,它是 6,这就是你得到的。

#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>
int main()

    std::cout << "default precision (6): " << 3.0500346 << '\n';
    std::cout << "std::precision(10):    " << std::setprecision(10) << 3.0500346 << '\n';

    return 0;

输出(Coliru link):

clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
default precision (6): 3.05003
std::precision(10):    3.0500346

另一方面,您返回的 GLFloat 是一个浮点数,而不是双精度浮点数,因此无论 glm 使用什么,您都将其转换为浮点数。所以最终,调用 maxX 会给你浮点精度,而不是双精度。

P.S:查看文档,似乎有一个 dvec 类型,这让我怀疑 vec 默认使用 double。

【讨论】:

【参考方案2】:

不,它们是单精度 float 可以插入 VBO,顺便说一下,GLFoat 也是如此。

即使不会打印所有数字,您仍然可以获得正确的索引。

【讨论】:

以上是关于glm::vec3 精度 C++的主要内容,如果未能解决你的问题,请参考以下文章

为啥 glm::vec3 不像浮动数组那样排序[关闭]

如何打印通过引用传递的 glm::vec3 类型的向量值?

glm::translate 与本地空间

C++:高精度随机双精度数

为啥灯光出现在对面?

管理 C++ 单精度和双精度混合计算的规则是啥?