tmask.pp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. program fpu;
  2. {$mode delphi}
  3. uses SysUtils,Math;
  4. var
  5. f1,f2 : double;
  6. caught: boolean;
  7. begin
  8. f1:=1.0;
  9. f2:=0.0;
  10. caught := false;
  11. try
  12. writeln('dividing by zero without having disabled FPU Exceptions...');
  13. writeln(f1/f2);
  14. writeln('no exception was raised');
  15. except on E:Exception do
  16. begin
  17. writeln('Exception occured:',E.Message);
  18. caught := true;
  19. end;
  20. end;
  21. if not caught then
  22. halt(1);
  23. writeln('Masking exceptions');
  24. writeln(integer(SetExceptionMask([exDenormalized,exInvalidOp,exOverflow,exPrecision,exUnderflow,exZeroDivide]))); //Returns 61, as expected
  25. writeln(integer(GetExceptionMask)); //Returns 4 - unexpected???
  26. writeln(integer([exZeroDivide])); //Returns 4
  27. caught := false;
  28. try
  29. writeln('dividing by zero with FPU Exceptions disabled...');
  30. writeln(f1/f2);
  31. writeln('no exception was raised');
  32. except on E:Exception do
  33. begin
  34. writeln('Exception occured:',E.Message);
  35. caught := true;
  36. end;
  37. end;
  38. if caught then
  39. halt(2);
  40. writeln(integer(SetExceptionMask([exDenormalized,exInvalidOp,exOverflow,exPrecision,exUnderflow]))); //Returns 61, as expected
  41. writeln(integer(GetExceptionMask)); //Returns 4 - unexpected???
  42. writeln(integer([exZeroDivide])); //Returns 4
  43. caught := false;
  44. try
  45. writeln('dividing by zero without having disabled FPU Exceptions...');
  46. writeln(f1/f2);
  47. writeln('no exception was raised');
  48. except on E:Exception do
  49. begin
  50. writeln('Exception occured:',E.Message);
  51. caught := true;
  52. end;
  53. end;
  54. if not caught then
  55. halt(0);
  56. end.