[flang][runtime] Improve G0 output editing

G0 output editing should never overflow an output field and fill it
with asterisks.  It should also never elide the "E" in an exponent
field, even if it has more than three digits.

Differential Revision: https://reviews.llvm.org/D128396
This commit is contained in:
Peter Klausler 2022-06-22 13:27:59 -07:00
parent 5ca68d5845
commit df6afee985
2 changed files with 12 additions and 11 deletions

View File

@ -199,7 +199,7 @@ const char *RealOutputEditingBase::FormatExponent(
}
*--exponent = expo < 0 ? '-' : '+';
if (edit.expoDigits || edit.IsListDirected() || exponent + 3 == eEnd) {
*--exponent = edit.descriptor == 'D' ? 'D' : 'E'; // not 'G'
*--exponent = edit.descriptor == 'D' ? 'D' : 'E'; // not 'G' or 'Q'
}
length = eEnd - exponent;
return overflow ? nullptr : exponent;
@ -264,9 +264,7 @@ bool RealOutputEditing<binaryPrecision>::EditEorDOutput(const DataEdit &edit) {
if (editWidth == 0) { // "the processor selects the field width"
if (edit.digits.has_value()) { // E0.d
if (editDigits == 0) { // E0.0
editWidth = 7; // -.0E+ee
} else {
editWidth = editDigits + 6; // -.666E+ee
significantDigits = 1;
}
} else { // E0
flags |= decimal::Minimize;
@ -485,7 +483,7 @@ DataEdit RealOutputEditing<binaryPrecision>::EditForGOutput(DataEdit edit) {
int significantDigits{
edit.digits.value_or(BinaryFloatingPoint::decimalPrecision)}; // 'd'
if (editWidth > 0 && significantDigits == 0) {
return edit; // Gw.0 -> Ew.0 for w > 0
return edit; // Gw.0Ee -> Ew.0Ee for w > 0
}
int flags{0};
if (edit.modes.editingFlags & signPlus) {
@ -498,7 +496,10 @@ DataEdit RealOutputEditing<binaryPrecision>::EditForGOutput(DataEdit edit) {
}
int expo{IsZero() ? 1 : converted.decimalExponent}; // 's'
if (expo < 0 || expo > significantDigits) {
return edit; // Ew.d
if (editWidth == 0 && !edit.expoDigits) { // G0.d -> G0.dE0
edit.expoDigits = 0;
}
return edit; // Ew.dEe
}
edit.descriptor = 'F';
edit.modes.scale = 0; // kP is ignored for G when no exponent field

View File

@ -394,9 +394,9 @@ TEST(IOApiTests, FormatDoubleValues) {
{"(E62.55,';')",
" 0.1000000000000000055511151231257827021181583404541015625E+"
"00;"},
{"(E0.0,';')", "0.E+00;"},
{"(E0.0,';')", ".1E+00;"},
{"(E0.55,';')",
"0.1000000000000000055511151231257827021181583404541015625E+"
".1000000000000000055511151231257827021181583404541015625E+"
"00;"},
{"(E0,';')", ".1E+00;"},
{"(F58.55,';')",
@ -491,7 +491,7 @@ TEST(IOApiTests, FormatDoubleValues) {
"701797267771758512566055119913150489110145103786273816725095"
"583738973359899366480994116420570263709027924276754456522908"
"75386825064197182655334472656250-323;"},
{"(G0,';')", ".5-323;"},
{"(G0,';')", ".5E-323;"},
{"(E757.750,';')",
" 0."
"494065645841246544176568792868221372365059802614324764425585"
@ -586,7 +586,7 @@ TEST(IOApiTests, FormatDoubleValues) {
"408698898317506783884692609277397797285865965494109136909540"
"61364675687023986783152906809846172109246253967285156250-"
"307;"},
{"(G0,';')", ".22250738585072014-307;"},
{"(G0,';')", ".22250738585072014E-307;"},
}},
{// greatest finite
0x7fefffffffffffffuLL,
@ -616,7 +616,7 @@ TEST(IOApiTests, FormatDoubleValues) {
"090389328944075868508455133942304583236903222948165808559332"
"123348274797826204144723168738177180919299881250404026184124"
"8583680000+306;"},
{"(G0,';')", ".17976931348623157+309;"},
{"(G0,';')", ".17976931348623157E+309;"},
}},
};