update icu-avoid-x87-excess-precision.diff
OBS-URL: https://build.opensuse.org/package/show/X11:common:Factory/icu?expand=0&rev=93
This commit is contained in:
parent
e7a70e6ab8
commit
ae11f22b17
@ -1,24 +1,46 @@
|
|||||||
---
|
From: Jan Engelhardt <jengelh@inai.de>
|
||||||
source/i18n/plurrule.cpp | 4 ++--
|
Date: 2018-08-06 22:57:07.717647182 +0200
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
Index: icu/source/i18n/plurrule.cpp
|
getPluralOperand returns double, which causes the other operand to get
|
||||||
|
upconverted from long long to double, and there seems to be rounding errors on
|
||||||
|
i586 (possibly from excess precision, aka 80-bit floats).
|
||||||
|
|
||||||
|
Since the result of getPluralOption is printed with %lld at one point, this
|
||||||
|
suggests that the result is intended to be downconverted to long long instead
|
||||||
|
of upconverting the LL constant. That's why we do not use a (volatile double)
|
||||||
|
cast here like in opensuse icu 61.
|
||||||
|
|
||||||
|
---
|
||||||
|
source/test/intltest/dcfmapts.cpp | 8 ++++----
|
||||||
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
Index: icu/source/test/intltest/dcfmapts.cpp
|
||||||
===================================================================
|
===================================================================
|
||||||
--- icu.orig/source/i18n/plurrule.cpp
|
--- icu.orig/source/test/intltest/dcfmapts.cpp
|
||||||
+++ icu/source/i18n/plurrule.cpp
|
+++ icu/source/test/intltest/dcfmapts.cpp
|
||||||
@@ -1566,13 +1566,13 @@ int64_t FixedDecimal::getFractionalDigit
|
@@ -851,7 +851,7 @@ void IntlTestDecimalFormatAPI::TestFixed
|
||||||
return 0;
|
ASSERT_EQUAL(22, fd.getPluralOperand(PLURAL_OPERAND_V));
|
||||||
|
ASSERT_EQUAL(1234567890123456789LL, fd.getPluralOperand(PLURAL_OPERAND_F));
|
||||||
|
ASSERT_EQUAL(1234567890123456789LL, fd.getPluralOperand(PLURAL_OPERAND_T));
|
||||||
|
- ASSERT_EQUAL(345678901234567890LL, fd.getPluralOperand(PLURAL_OPERAND_I));
|
||||||
|
+ ASSERT_EQUAL(345678901234567890LL, (long long)fd.getPluralOperand(PLURAL_OPERAND_I));
|
||||||
|
ASSERT_EQUAL(FALSE, fd.hasIntegerValue());
|
||||||
|
ASSERT_EQUAL(FALSE, fd.isNegative());
|
||||||
|
|
||||||
|
@@ -948,13 +948,13 @@ void IntlTestDecimalFormatAPI::TestFixed
|
||||||
|
// int64_t fields to 18 digits. See ticket Ticket #10374
|
||||||
|
// ASSERT_EQUAL(223372036854775807LL, fd.getPluralOperand(PLURAL_OPERAND_I);
|
||||||
|
if (!(
|
||||||
|
- fd.getPluralOperand(PLURAL_OPERAND_I) == 223372036854775807LL ||
|
||||||
|
- fd.getPluralOperand(PLURAL_OPERAND_I) == 9223372036854775807LL)) {
|
||||||
|
+ (long long)fd.getPluralOperand(PLURAL_OPERAND_I) == 223372036854775807LL ||
|
||||||
|
+ (long long)fd.getPluralOperand(PLURAL_OPERAND_I) == 9223372036854775807LL)) {
|
||||||
|
dataerrln(
|
||||||
|
"File %s, Line %d, fd.getPluralOperand(PLURAL_OPERAND_I = %lld",
|
||||||
|
__FILE__,
|
||||||
|
__LINE__,
|
||||||
|
- fd.getPluralOperand(PLURAL_OPERAND_I));
|
||||||
|
+ (long long)fd.getPluralOperand(PLURAL_OPERAND_I));
|
||||||
}
|
}
|
||||||
n = fabs(n);
|
ASSERT_EQUAL(TRUE, fd.hasIntegerValue());
|
||||||
- double fract = n - floor(n);
|
ASSERT_EQUAL(FALSE, fd.isNegative());
|
||||||
+ volatile double fract = n - floor(n);
|
|
||||||
switch (v) {
|
|
||||||
case 1: return (int64_t)(fract*10.0 + 0.5);
|
|
||||||
case 2: return (int64_t)(fract*100.0 + 0.5);
|
|
||||||
case 3: return (int64_t)(fract*1000.0 + 0.5);
|
|
||||||
default:
|
|
||||||
- double scaled = floor(fract * pow(10.0, (double)v) + 0.5);
|
|
||||||
+ volatile double scaled = floor(fract * pow(10.0, (double)v) + 0.5);
|
|
||||||
if (scaled > U_INT64_MAX) {
|
|
||||||
return U_INT64_MAX;
|
|
||||||
} else {
|
|
||||||
|
Loading…
Reference in New Issue
Block a user