[llvm] r189442 - Change default # of digits for APFloat::toString
Charles Davis
cdavis5x at gmail.com
Tue Aug 27 23:17:24 PDT 2013
On Aug 27, 2013, at 11:23 PM, Eli Friedman wrote:
> Author: efriedma
> Date: Wed Aug 28 00:23:51 2013
> New Revision: 189442
>
> URL: http://llvm.org/viewvc/llvm-project?rev=189442&view=rev
> Log:
> Change default # of digits for APFloat::toString
>
> The previous default was almost, but not quite enough digits to
> represent a floating-point value in a manner which preserves the
> representation when it's read back in. The larger default is much
> less confusing.
>
> I spent some time looking into printing exactly the right number of
> digits if a precision isn't specified, but it's kind of complicated,
> and I'm not really sure I understand what APFloat::toString is supposed
> to output for FormatPrecision != 0 (or maybe the current API specification
> is just silly, not sure which). I have a WIP patch if anyone is interested.
This is causing (I believe) the following Clang test failures for at least me:
Clang :: CXX/expr/expr.const/p2-0x.cpp
Clang :: CXX/temp/temp.spec/p5.cpp
Clang :: PCH/exprs.c
Clang :: PCH/floating-literal.c
Clang :: PCH/objc_literals.m
Clang :: Rewriter/objc-modern-boxing.mm
Clang :: Rewriter/objc-modern-numeric-literal.mm
Clang :: Sema/array-init.c
Clang :: Sema/knr-def-call.c
Clang :: SemaCXX/warn-literal-conversion.cpp
Clang :: SemaTemplate/member-template-access-expr.cpp
As far as I can tell, all the failures are caused by the greater precision printed out. Here's the output from the first one:
FAIL: Clang :: CXX/expr/expr.const/p2-0x.cpp (603 of 15277)
******************** TEST 'Clang :: CXX/expr/expr.const/p2-0x.cpp' FAILED ********************
Script:
--
/Users/chip/llvm-git/build1/Release+Asserts/bin/clang -cc1 -internal-isystem /Users/chip/llvm-git/build1/Release+Asserts/bin/../lib/clang/3.4/include -fsyntax-only -std=c++11 -pedantic -verify -fcxx-exceptions /Users/chip/llvm-git/tools/clang/test/CXX/expr/expr.const/p2-0x.cpp -fconstexpr-depth 128 -triple i686-pc-linux-gnu
--
Exit Code: 1
Command Output (stderr):
--
error: 'note' diagnostics expected but not seen:
File /Users/chip/llvm-git/tools/clang/test/CXX/expr/expr.const/p2-0x.cpp Line 139: value 1.0E+300 is outside the range of representable values of type 'float'
error: 'note' diagnostics seen but not expected:
File /Users/chip/llvm-git/tools/clang/test/CXX/expr/expr.const/p2-0x.cpp Line 139: value 1.0000000000000001E+300 is outside the range of representable values of type 'float'
2 errors generated.
--
Did you remember to also update Clang?
Chip
>
> Modified:
> llvm/trunk/lib/Support/APFloat.cpp
> llvm/trunk/unittests/ADT/APFloatTest.cpp
>
> Modified: llvm/trunk/lib/Support/APFloat.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/APFloat.cpp?rev=189442&r1=189441&r2=189442&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/APFloat.cpp (original)
> +++ llvm/trunk/lib/Support/APFloat.cpp Wed Aug 28 00:23:51 2013
> @@ -3546,11 +3546,14 @@ void APFloat::toString(SmallVectorImpl<c
> // Set FormatPrecision if zero. We want to do this before we
> // truncate trailing zeros, as those are part of the precision.
> if (!FormatPrecision) {
> - // It's an interesting question whether to use the nominal
> - // precision or the active precision here for denormals.
> + // We use enough digits so the number can be round-tripped back to an
> + // APFloat. The formula comes from "How to Print Floating-Point Numbers
> + // Accurately" by Steele and White.
> + // FIXME: Using a formula based purely on the precision is conservative;
> + // we can print fewer digits depending on the actual value being printed.
>
> - // FormatPrecision = ceil(significandBits / lg_2(10))
> - FormatPrecision = (semantics->precision * 59 + 195) / 196;
> + // FormatPrecision = 2 + floor(significandBits / lg_2(10))
> + FormatPrecision = 2 + semantics->precision * 59 / 196;
> }
>
> // Ignore trailing binary zeros.
>
> Modified: llvm/trunk/unittests/ADT/APFloatTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/APFloatTest.cpp?rev=189442&r1=189441&r2=189442&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/ADT/APFloatTest.cpp (original)
> +++ llvm/trunk/unittests/ADT/APFloatTest.cpp Wed Aug 28 00:23:51 2013
> @@ -866,10 +866,11 @@ TEST(APFloatTest, toString) {
> ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2));
> ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2));
> ASSERT_EQ("1.01E-2", convertToString(1.01E-2, 5, 1));
> - ASSERT_EQ("0.7853981633974483", convertToString(0.78539816339744830961, 0, 3));
> - ASSERT_EQ("4.940656458412465E-324", convertToString(4.9406564584124654e-324, 0, 3));
> - ASSERT_EQ("873.1834", convertToString(873.1834, 0, 1));
> - ASSERT_EQ("8.731834E+2", convertToString(873.1834, 0, 0));
> + ASSERT_EQ("0.78539816339744828", convertToString(0.78539816339744830961, 0, 3));
> + ASSERT_EQ("4.9406564584124654E-324", convertToString(4.9406564584124654e-324, 0, 3));
> + ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1));
> + ASSERT_EQ("8.7318340000000001E+2", convertToString(873.1834, 0, 0));
> + ASSERT_EQ("1.7976931348623157E+308", convertToString(1.7976931348623157E+308, 0, 0));
> }
>
> TEST(APFloatTest, toInteger) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list