https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104117
--- Comment #2 from Iain Sandoe <iains at gcc dot gnu.org> --- reduced testcase: typedef int int32_t; extern "C" { extern double floor( double ); extern double fabs( double ); int atoi(const char *); int sprintf(char * , const char * , ...) ; } namespace icu_67 { class __attribute__((visibility("default"))) FixedDecimal { public: static int32_t decimals(double n); }; //using namespace icu::pluralimpl; //using icu::number::impl::DecimalQuantity; static int32_t p10[] = {1, 10, 100, 1000, 10000}; int32_t FixedDecimal::decimals(double n) { n = fabs(n); for (int ndigits=0; ndigits<=3; ndigits++) { double scaledN = n * p10[ndigits]; if (scaledN == floor(scaledN)) { return ndigits; } } char buf[30] = {0}; sprintf(buf, "%1.15e", n); int exponent = atoi(buf+18); int numFractionDigits = 15; for (int i=16; ; --i) { if (buf[i] != '0') { break; } --numFractionDigits; } numFractionDigits -= exponent; return numFractionDigits; } }