forked from OSchip/llvm-project
[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:
parent
5ca68d5845
commit
df6afee985
|
@ -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
|
||||
|
|
|
@ -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;"},
|
||||
}},
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue