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:
Syoyo Fujita
2026-01-11 06:10:20 +09:00
parent 62c4ae263e
commit 10978c96c8

View File

@@ -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) {