2016 Update
This commit is contained in:
parent
948b86eafa
commit
dcf5d15da3
7965 changed files with 139854 additions and 31002 deletions
|
|
@ -5,10 +5,18 @@
|
|||
The IEEE floating point specification defines certain 'extreme' floating point values such as minus zero, -0.0, a value distinct from plus zero; not a number, NaN; and plus and minus infinity.
|
||||
|
||||
The task is to use expressions involving other 'normal' floating point values in your language to calculate these, (and maybe other), extreme floating point values in your language and assign them to variables.
|
||||
Print the values of these variables if possible; and show some arithmetic with these values and variables. If your language can directly enter these extreme floating point values then show it.
|
||||
|
||||
<br>C.f:
|
||||
* [http://www.cl.cam.ac.uk/teaching/1011/FPComp/floatingmath.pdf What Every Computer Scientist Should Know About Floating-Point Arithmetic]
|
||||
* [[Infinity]]
|
||||
* [[Detect division by zero]]
|
||||
* [[Literals/Floating point]]
|
||||
Print the values of these variables if possible; and show some arithmetic with these values and variables.
|
||||
|
||||
If your language can directly enter these extreme floating point values then show it.
|
||||
|
||||
|
||||
;See also:
|
||||
* [http://www.cl.cam.ac.uk/teaching/1011/FPComp/floatingmath.pdf What Every Computer Scientist Should Know About Floating-Point Arithmetic]
|
||||
|
||||
|
||||
;Related tasks:
|
||||
* [[Infinity]]
|
||||
* [[Detect division by zero]]
|
||||
* [[Literals/Floating point]]
|
||||
<br><br>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
REAL*8 BAD,NaN !Sometimes a number is not what is appropriate.
|
||||
PARAMETER (NaN = Z'FFFFFFFFFFFFFFFF') !This value is recognised in floating-point arithmetic.
|
||||
PARAMETER (BAD = Z'FFFFFFFFFFFFFFFF') !I pay special attention to BAD values.
|
||||
CHARACTER*3 BADASTEXT !Speakable form.
|
||||
DATA BADASTEXT/" ? "/ !Room for "NaN", short for "Not a Number", if desired.
|
||||
REAL*8 PINF,NINF !Special values. No sign of an "overflow" state, damnit.
|
||||
PARAMETER (PINF = Z'7FF0000000000000') !May well cause confusion
|
||||
PARAMETER (NINF = Z'FFF0000000000000') !On a cpu not using this scheme.
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
Cause various arithmetic errors to see what sort of hissy fit is thrown.
|
||||
REAL X2,X3,X4,Y4,XX,ZERO
|
||||
INTEGER IX4,IY4
|
||||
EQUIVALENCE (X4,IX4),(Y4,IY4) !To view bits without provoking special fp handling.
|
||||
REAL*4 NaN4
|
||||
PARAMETER (NaN4 = Z'FFC00000') !FFFFFFFF
|
||||
c PARAMETER (NaN4 = Z'FFFFFFFF') !FFFFFFFF
|
||||
REAL*8 NaN8,X8(5),Y8,INF8
|
||||
PARAMETER (NaN8 = Z'FFF8000000000000') !FFFFFFFF
|
||||
c PARAMETER (NaN8 = Z'FFFFFFFFFFFFFFFF')
|
||||
LOGICAL LX(5)
|
||||
INTEGER I
|
||||
X4 = NaN4
|
||||
WRITE (6,1) X4,IX4
|
||||
1 FORMAT ("X4 =",F12.4,' Hex ',Z8)
|
||||
WRITE (6,*) "Test X4 .EQ. Bad? ",X4.EQ.NaN4
|
||||
WRITE (6,*) "Test X4 .NE. Bad? ",X4.NE.NaN4
|
||||
WRITE (6,*) "Test IsNaN(X4) ",ISNAN(X4)
|
||||
WRITE (6,*) "Test Abs(bad) ",ABS(X4)
|
||||
c WRITE (6,*) "Test Exp(bad)",EXP(X4)
|
||||
Y8 = HUGE(Y8)
|
||||
WRITE(6,*) "Huge",Y8,LOG(Y8)
|
||||
Y8 = LOG(Y8)
|
||||
WRITE (6,*) "Hic",EXP(Y8)
|
||||
|
||||
X2 = 0
|
||||
X3 = 0
|
||||
ZERO = 0
|
||||
XX = 666.66
|
||||
X2 = XX + X4
|
||||
WRITE (6,*) "Test x + BAD ",X2
|
||||
WRITE (6,*) "Test 0/0 ",X3/ZERO
|
||||
WRITE (6,*) "Test 1/0 ",1/ZERO
|
||||
WRITE (6,*) "Test-1/0 ",-1/ZERO
|
||||
X2 = MIN(XX,X4)
|
||||
WRITE (6,*) "Test min(x,Bad) ",X2
|
||||
WRITE (6,*) "Test min(x,NaN4)",MIN(XX,NaN4)
|
||||
c WRITE (6,*) "Test mod(x,Bad) ",MOD(XX,X4)
|
||||
c WRITE (6,*) "Test mod(Bad,x) ",MOD(X4,XX)
|
||||
c WRITE (6,*) "Test mod(x,0) ",MOD(XX,Z)
|
||||
c WRITE (6,*) "Sqrt(Bad)",SQRT(X4)
|
||||
|
||||
DO I = 1,0,-1 !for sqrt(-1), a snarl.
|
||||
X4 = I
|
||||
X4 = X4/FLOAT(I)
|
||||
Y4 = SQRT(FLOAT(I))
|
||||
WRITE (6,10) I,I,X4,IX4,I,Y4,IY4
|
||||
10 FORMAT (I3,"/",I3," gives",F9.5," Hex ",Z8,
|
||||
1 ", Sqrt(",I3,") gives",F9.5," Hex ",Z8)
|
||||
END DO
|
||||
|
||||
Contemplate double precision.
|
||||
WRITE (6,*)
|
||||
WRITE (6,*) "Problems with IsNaN and arrays..."
|
||||
DO I = 1,5
|
||||
X8(I) = I
|
||||
END DO
|
||||
X8(3:4) = NaN8
|
||||
WRITE (6,*) "X=",X8
|
||||
WRITE (6,*) "X(2:4)=",X8(2:4)
|
||||
WRITE (6,*) "isnan(x(2:4))",ISNAN(X8(2:4))
|
||||
WRITE (6,*) "isnan(x(2))..(4))",ISNAN(X8(2)),ISNAN(X8(3)),
|
||||
1 ISNAN(X8(4))
|
||||
WRITE (6,*) "abs(x(2:4))",ABS(X8(2:4))
|
||||
WRITE (6,*) "isnan(abs(x(2:4)))",ISNAN(ABS(X8(2:4)))
|
||||
LX = ISNAN(X8)
|
||||
WRITE (6,*) "LX = isnan(X)",LX
|
||||
|
||||
XX = HUGE(XX)
|
||||
WRITE(6,*) "Huge(x)=",XX,-XX
|
||||
XX = 1/ZERO
|
||||
WRITE(6,11) XX,-XX
|
||||
11 FORMAT("1/Zero=",Z8,", neg ",Z8)
|
||||
INF8 = XX
|
||||
WRITE (6,12) INF8,-INF8
|
||||
12 FORMAT("1/Zero=",Z16,", neg ",Z16)
|
||||
WRITE (6,*) "Burp!"
|
||||
END
|
||||
|
|
@ -1,8 +1,8 @@
|
|||