gnu / gcc / 4a0fed0c0c7241562eaa5f1a4c916b689429ad86 / . / libgcc / config / rs6000 / ibm-ldouble-format

Long double format | |

================== | |

Each long double is made up of two IEEE doubles. The value of the | |

long double is the sum of the values of the two parts (except for | |

-0.0). The most significant part is required to be the value of the | |

long double rounded to the nearest double, as specified by IEEE. For | |

Inf values, the least significant part is required to be one of +0.0 | |

or -0.0. No other requirements are made; so, for example, 1.0 may be | |

represented as (1.0, +0.0) or (1.0, -0.0), and the low part of a NaN | |

is don't-care. | |

Classification | |

-------------- | |

A long double can represent any value of the form | |

s * 2^e * sum(k=0...105: f_k * 2^(-k)) | |

where 's' is +1 or -1, 'e' is between 1022 and -968 inclusive, f_0 is | |

1, and f_k for k>0 is 0 or 1. These are the 'normal' long doubles. | |

A long double can also represent any value of the form | |

s * 2^-968 * sum(k=0...105: f_k * 2^(-k)) | |

where 's' is +1 or -1, f_0 is 0, and f_k for k>0 is 0 or 1. These are | |

the 'subnormal' long doubles. | |

There are four long doubles that represent zero, two that represent | |

+0.0 and two that represent -0.0. The sign of the high part is the | |

sign of the long double, and the sign of the low part is ignored. | |

Likewise, there are four long doubles that represent infinities, two | |

for +Inf and two for -Inf. | |

Each NaN, quiet or signalling, that can be represented as a 'double' | |

can be represented as a 'long double'. In fact, there are 2^64 | |

equivalent representations for each one. | |

There are certain other valid long doubles where both parts are | |

nonzero but the low part represents a value which has a bit set below | |

2^(e-105). These, together with the subnormal long doubles, make up | |

the denormal long doubles. | |

Many possible long double bit patterns are not valid long doubles. | |

These do not represent any value. | |

Limits | |

------ | |

The maximum representable long double is 2^1024-2^918. The smallest | |

*normal* positive long double is 2^-968. The smallest denormalised | |

positive long double is 2^-1074 (this is the same as for 'double'). | |

Conversions | |

----------- | |

A double can be converted to a long double by adding a zero low part. | |

A long double can be converted to a double by removing the low part. | |

Comparisons | |

----------- | |

Two long doubles can be compared by comparing the high parts, and if | |

those compare equal, comparing the low parts. | |

Arithmetic | |

---------- | |

The unary negate operation operates by negating the low and high parts. | |

An absolute or absolute-negate operation must be done by comparing | |

against zero and negating if necessary. | |

Addition and subtraction are performed using library routines. They | |

are not at present performed perfectly accurately, the result produced | |

will be within 1ulp of the range generated by adding or subtracting | |

1ulp from the input values, where a 'ulp' is 2^(e-106) given the | |

exponent 'e'. In the presence of cancellation, this may be | |

arbitrarily inaccurate. Subtraction is done by negation and addition. | |

Multiplication is also performed using a library routine. Its result | |

will be within 2ulp of the correct result. | |

Division is also performed using a library routine. Its result will | |

be within 3ulp of the correct result. | |

Copyright (C) 2004-2021 Free Software Foundation, Inc. | |

Copying and distribution of this file, with or without modification, | |

are permitted in any medium without royalty provided the copyright | |

notice and this notice are preserved. |