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::vec3
是double
而double
比这更精确?
有一个更好的方法吗?我的 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++的主要内容,如果未能解决你的问题,请参考以下文章