writer: Simplify floats when printed
Add `tint::writer::FloatToString()`:
Converts the float `f` to a string using fixed-point notation (not scientific).
The float will be printed with the full precision required to describe the float.
All trailing `0`s will be omitted after the last non-zero fractional number,
unless the fractional is zero, in which case the number will end with `.0`.
Use this for the wgsl, msl and hlsl backends.
Change-Id: If5701136579e4398c31c673942f30e8877e9f813
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/33421
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 91d1930..5d81f2c 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -51,6 +51,7 @@
#include "src/ast/uint_literal.h"
#include "src/ast/unary_op_expression.h"
#include "src/ast/variable_decl_statement.h"
+#include "src/writer/float_to_string.h"
namespace tint {
namespace writer {
@@ -1455,16 +1456,7 @@
if (lit->IsBool()) {
out << (lit->AsBool()->IsTrue() ? "true" : "false");
} else if (lit->IsFloat()) {
- auto flags = out.flags();
- auto precision = out.precision();
-
- out.flags(flags | std::ios_base::showpoint);
- out.precision(std::numeric_limits<float>::max_digits10);
-
- out << lit->AsFloat()->value() << "f";
-
- out.precision(precision);
- out.flags(flags);
+ out << FloatToString(lit->AsFloat()->value()) << "f";
} else if (lit->IsSint()) {
out << lit->AsSint()->value();
} else if (lit->IsUint()) {
diff --git a/src/writer/hlsl/generator_impl_binary_test.cc b/src/writer/hlsl/generator_impl_binary_test.cc
index baf428d..3f8d547 100644
--- a/src/writer/hlsl/generator_impl_binary_test.cc
+++ b/src/writer/hlsl/generator_impl_binary_test.cc
@@ -166,8 +166,8 @@
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
EXPECT_TRUE(gen.EmitExpression(pre, out, &expr)) << gen.error();
EXPECT_EQ(result(),
- "(float3(1.00000000f, 1.00000000f, 1.00000000f) * "
- "1.00000000f)");
+ "(float3(1.0f, 1.0f, 1.0f) * "
+ "1.0f)");
}
TEST_F(HlslGeneratorImplTest_Binary, Multiply_ScalarVector) {
@@ -191,8 +191,8 @@
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
EXPECT_TRUE(gen.EmitExpression(pre, out, &expr)) << gen.error();
EXPECT_EQ(result(),
- "(1.00000000f * float3(1.00000000f, 1.00000000f, "
- "1.00000000f))");
+ "(1.0f * float3(1.0f, 1.0f, "
+ "1.0f))");
}
TEST_F(HlslGeneratorImplTest_Binary, Multiply_MatrixScalar) {
@@ -210,7 +210,7 @@
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
EXPECT_TRUE(gen.EmitExpression(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(), "(mat * 1.00000000f)");
+ EXPECT_EQ(result(), "(mat * 1.0f)");
}
TEST_F(HlslGeneratorImplTest_Binary, Multiply_ScalarMatrix) {
@@ -228,7 +228,7 @@
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
EXPECT_TRUE(gen.EmitExpression(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(), "(1.00000000f * mat)");
+ EXPECT_EQ(result(), "(1.0f * mat)");
}
TEST_F(HlslGeneratorImplTest_Binary, Multiply_MatrixVector) {
@@ -254,8 +254,7 @@
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
EXPECT_TRUE(gen.EmitExpression(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(),
- "mul(mat, float3(1.00000000f, 1.00000000f, 1.00000000f))");
+ EXPECT_EQ(result(), "mul(mat, float3(1.0f, 1.0f, 1.0f))");
}
TEST_F(HlslGeneratorImplTest_Binary, Multiply_VectorMatrix) {
@@ -282,8 +281,7 @@
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
EXPECT_TRUE(gen.EmitExpression(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(),
- "mul(float3(1.00000000f, 1.00000000f, 1.00000000f), mat)");
+ EXPECT_EQ(result(), "mul(float3(1.0f, 1.0f, 1.0f), mat)");
}
TEST_F(HlslGeneratorImplTest_Binary, Multiply_MatrixMatrix) {
diff --git a/src/writer/hlsl/generator_impl_constructor_test.cc b/src/writer/hlsl/generator_impl_constructor_test.cc
index 6590765..69c4768 100644
--- a/src/writer/hlsl/generator_impl_constructor_test.cc
+++ b/src/writer/hlsl/generator_impl_constructor_test.cc
@@ -70,7 +70,7 @@
ast::ScalarConstructorExpression expr(lit);
ASSERT_TRUE(gen.EmitConstructor(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(), "1.07374182e+09f");
+ EXPECT_EQ(result(), "1073741824.0f");
}
TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Float) {
@@ -83,7 +83,7 @@
ast::TypeConstructorExpression expr(&f32, values);
ASSERT_TRUE(gen.EmitConstructor(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(), "float(-1.20000004e-05f)");
+ EXPECT_EQ(result(), "float(-0.000012f)");
}
TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Bool) {
@@ -140,7 +140,7 @@
ast::TypeConstructorExpression expr(&vec, values);
ASSERT_TRUE(gen.EmitConstructor(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(), "float3(1.00000000f, 2.00000000f, 3.00000000f)");
+ EXPECT_EQ(result(), "float3(1.0f, 2.0f, 3.0f)");
}
TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Vec_Empty) {
@@ -186,10 +186,8 @@
// A matrix of type T with n columns and m rows can also be constructed from
// n vectors of type T with m components.
- EXPECT_EQ(
- result(),
- std::string("float3x2(float3(1.00000000f, 2.00000000f, 3.00000000f), ") +
- "float3(3.00000000f, 4.00000000f, 5.00000000f))");
+ EXPECT_EQ(result(),
+ "float3x2(float3(1.0f, 2.0f, 3.0f), float3(3.0f, 4.0f, 5.0f))");
}
TEST_F(HlslGeneratorImplTest_Constructor, EmitConstructor_Type_Array) {
@@ -218,10 +216,9 @@
ast::TypeConstructorExpression expr(&ary, ary_values);
ASSERT_TRUE(gen.EmitConstructor(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(), std::string("{") +
- "float3(1.00000000f, 2.00000000f, 3.00000000f), " +
- "float3(4.00000000f, 5.00000000f, 6.00000000f), " +
- "float3(7.00000000f, 8.00000000f, 9.00000000f)}");
+ EXPECT_EQ(result(),
+ "{float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f),"
+ " float3(7.0f, 8.0f, 9.0f)}");
}
// TODO(dsinclair): Add struct constructor test.
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index 9d07d84..fc81bd5 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -503,7 +503,7 @@
EXPECT_EQ(result(), R"(RWByteAddressBuffer coord : register(u0);
void frag_main() {
- coord.Store(4, asuint(2.00000000f));
+ coord.Store(4, asuint(2.0f));
return;
}
@@ -588,7 +588,7 @@
ep_1_out ep_1(ep_1_in tint_in) {
ep_1_out tint_out;
- tint_out.bar = sub_func_ep_1(tint_in, tint_out, 1.00000000f);
+ tint_out.bar = sub_func_ep_1(tint_in, tint_out, 1.0f);
return tint_out;
}
@@ -652,7 +652,7 @@
ep_1_out ep_1() {
ep_1_out tint_out;
- tint_out.depth = sub_func(1.00000000f);
+ tint_out.depth = sub_func(1.0f);
return tint_out;
}
@@ -731,7 +731,7 @@
ep_1_out ep_1(ep_1_in tint_in) {
ep_1_out tint_out;
- tint_out.depth = sub_func_ep_1(tint_in, tint_out, 1.00000000f);
+ tint_out.depth = sub_func_ep_1(tint_in, tint_out, 1.0f);
return tint_out;
}
@@ -797,7 +797,7 @@
}
void frag_main() {
- float v = sub_func(1.00000000f);
+ float v = sub_func(1.0f);
return;
}
@@ -861,7 +861,7 @@
}
void frag_main() {
- float v = sub_func(1.00000000f);
+ float v = sub_func(1.0f);
return;
}
@@ -916,7 +916,7 @@
ep_1_out ep_1() {
ep_1_out tint_out;
- tint_out.bar = 1.00000000f;
+ tint_out.bar = 1.0f;
if ((1 == 1)) {
return tint_out;
}
diff --git a/src/writer/hlsl/generator_impl_import_test.cc b/src/writer/hlsl/generator_impl_import_test.cc
index fff3fcd..a55c452 100644
--- a/src/writer/hlsl/generator_impl_import_test.cc
+++ b/src/writer/hlsl/generator_impl_import_test.cc
@@ -62,7 +62,7 @@
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
ASSERT_TRUE(gen.EmitCall(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(), std::string(param.hlsl_name) + "(1.00000000f)");
+ EXPECT_EQ(result(), std::string(param.hlsl_name) + "(1.0f)");
}
INSTANTIATE_TEST_SUITE_P(HlslGeneratorImplTest_Import,
HlslImportData_SingleParamTest,
@@ -130,8 +130,7 @@
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
ASSERT_TRUE(gen.EmitCall(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(),
- std::string(param.hlsl_name) + "(1.00000000f, 2.00000000f)");
+ EXPECT_EQ(result(), std::string(param.hlsl_name) + "(1.0f, 2.0f)");
}
INSTANTIATE_TEST_SUITE_P(HlslGeneratorImplTest_Import,
HlslImportData_DualParamTest,
@@ -176,9 +175,9 @@
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
ASSERT_TRUE(gen.EmitCall(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(), std::string(param.hlsl_name) +
- "(float3(1.00000000f, 2.00000000f, 3.00000000f), "
- "float3(4.00000000f, 5.00000000f, 6.00000000f))");
+ EXPECT_EQ(result(),
+ std::string(param.hlsl_name) +
+ "(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f))");
}
INSTANTIATE_TEST_SUITE_P(HlslGeneratorImplTest_Import,
HlslImportData_DualParam_VectorTest,
@@ -227,8 +226,7 @@
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
ASSERT_TRUE(gen.EmitCall(pre, out, &expr)) << gen.error();
- EXPECT_EQ(result(), std::string(param.hlsl_name) +
- "(1.00000000f, 2.00000000f, 3.00000000f)");
+ EXPECT_EQ(result(), std::string(param.hlsl_name) + "(1.0f, 2.0f, 3.0f)");
}
INSTANTIATE_TEST_SUITE_P(
HlslGeneratorImplTest_Import,
diff --git a/src/writer/hlsl/generator_impl_loop_test.cc b/src/writer/hlsl/generator_impl_loop_test.cc
index 71bdd20..4e7bfdd 100644
--- a/src/writer/hlsl/generator_impl_loop_test.cc
+++ b/src/writer/hlsl/generator_impl_loop_test.cc
@@ -173,7 +173,7 @@
}
tint_hlsl_is_first_1 = false;
- lhs = 2.40000010f;
+ lhs = 2.400000095f;
other = 0.0f;
}
}
diff --git a/src/writer/hlsl/generator_impl_member_accessor_test.cc b/src/writer/hlsl/generator_impl_member_accessor_test.cc
index e7e1330..5c15ab6 100644
--- a/src/writer/hlsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/hlsl/generator_impl_member_accessor_test.cc
@@ -619,7 +619,7 @@
ASSERT_TRUE(td.DetermineResultType(&assign));
ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
- EXPECT_EQ(result(), R"(data.Store(4, asuint(2.00000000f));
+ EXPECT_EQ(result(), R"(data.Store(4, asuint(2.0f));
)");
}
@@ -826,9 +826,8 @@
ASSERT_TRUE(td.DetermineResultType(&assign));
ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
- EXPECT_EQ(
- result(),
- R"(data.Store3(16, asuint(float3(1.00000000f, 2.00000000f, 3.00000000f)));
+ EXPECT_EQ(result(),
+ R"(data.Store3(16, asuint(float3(1.0f, 2.0f, 3.0f)));
)");
}
@@ -1194,9 +1193,8 @@
ASSERT_TRUE(td.DetermineResultType(&assign));
ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
- EXPECT_EQ(
- result(),
- R"(data.Store3(16 + (32 * 2) + 0, asuint(float3(1.00000000f, 2.00000000f, 3.00000000f)));
+ EXPECT_EQ(result(),
+ R"(data.Store3(16 + (32 * 2) + 0, asuint(float3(1.0f, 2.0f, 3.0f)));
)");
}
@@ -1273,7 +1271,7 @@
ASSERT_TRUE(td.DetermineResultType(&assign));
ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
EXPECT_EQ(result(),
- R"(data.Store((4 * 1) + 16 + (32 * 2) + 0, asuint(1.00000000f));
+ R"(data.Store((4 * 1) + 16 + (32 * 2) + 0, asuint(1.0f));
)");
}
diff --git a/src/writer/hlsl/generator_impl_module_constant_test.cc b/src/writer/hlsl/generator_impl_module_constant_test.cc
index 3b78a97..84831d5 100644
--- a/src/writer/hlsl/generator_impl_module_constant_test.cc
+++ b/src/writer/hlsl/generator_impl_module_constant_test.cc
@@ -50,9 +50,7 @@
var->set_constructor(create<ast::TypeConstructorExpression>(&ary, exprs));
ASSERT_TRUE(gen.EmitProgramConstVariable(out, var)) << gen.error();
- EXPECT_EQ(
- result(),
- "static const float pos[3] = {1.00000000f, 2.00000000f, 3.00000000f};\n");
+ EXPECT_EQ(result(), "static const float pos[3] = {1.0f, 2.0f, 3.0f};\n");
}
TEST_F(HlslGeneratorImplTest_ModuleConstant, Emit_SpecConstant) {
@@ -70,7 +68,7 @@
ASSERT_TRUE(gen.EmitProgramConstVariable(out, var)) << gen.error();
EXPECT_EQ(result(), R"(#ifndef WGSL_SPEC_CONSTANT_23
-#define WGSL_SPEC_CONSTANT_23 3.00000000f
+#define WGSL_SPEC_CONSTANT_23 3.0f
#endif
static const float pos = WGSL_SPEC_CONSTANT_23;
#undef WGSL_SPEC_CONSTANT_23