mirror of
https://github.com/lighttransport/tinyusdz.git
synced 2026-01-18 01:11:17 +01:00
Fix double/float precision in timeSamples printing
Print double and float values with full precision in timeSamples to avoid truncation of significant digits. Changes: - Add specializations for print_type<double> and print_type<float> - Use std::setprecision(std::numeric_limits<T>::max_digits10) for full precision - Add includes for <iomanip> and <limits> Before: - double: 3.14159 (truncated to ~6 digits) - float: similar truncation After: - double: 3.1415926535897931 (17 digits - max_digits10 for double) - float: 3.14159012 (9 digits - max_digits10 for float) This ensures no precision loss when round-tripping USD files with double/float timeSamples values. Test: timesamples-scalar-double-001.usda now prints with full precision
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
#include <sstream>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <iomanip>
|
||||
#include <limits>
|
||||
|
||||
#ifdef TINYUSDZ_ENABLE_THREAD
|
||||
#include <thread>
|
||||
@@ -194,6 +196,28 @@ void print_type<char>(OutputAdapter& out, const uint8_t* data) {
|
||||
out.write(static_cast<int>(value));
|
||||
}
|
||||
|
||||
// Specialization for double - print with full precision
|
||||
template<>
|
||||
void print_type<double>(OutputAdapter& out, const uint8_t* data) {
|
||||
double value;
|
||||
std::memcpy(&value, data, sizeof(double));
|
||||
std::stringstream ss;
|
||||
ss << std::setprecision(std::numeric_limits<double>::max_digits10);
|
||||
ss << value;
|
||||
out.write(ss.str());
|
||||
}
|
||||
|
||||
// Specialization for float - print with full precision
|
||||
template<>
|
||||
void print_type<float>(OutputAdapter& out, const uint8_t* data) {
|
||||
float value;
|
||||
std::memcpy(&value, data, sizeof(float));
|
||||
std::stringstream ss;
|
||||
ss << std::setprecision(std::numeric_limits<float>::max_digits10);
|
||||
ss << value;
|
||||
out.write(ss.str());
|
||||
}
|
||||
|
||||
// Unified print function for vector types
|
||||
template<typename T, size_t N>
|
||||
void print_vector(OutputAdapter& out, const uint8_t* data) {
|
||||
|
||||
Reference in New Issue
Block a user