 |
Changeset 3180
- Timestamp:
- 02/14/08 03:20:22
(10 months ago)
- Author:
- Don Clugston
- Message:
More fixes for quadruple reals. In particular, ieeeMean was horribly broken.
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r3177 |
r3180 |
|
| 229 | 229 | INVALID_MASK = 0xF80 |
|---|
| 230 | 230 | } |
|---|
| | 231 | } else { //SPARC -- not yet implemented |
|---|
| | 232 | enum : int { |
|---|
| | 233 | INEXACT_MASK = 0, |
|---|
| | 234 | UNDERFLOW_MASK = 0, |
|---|
| | 235 | OVERFLOW_MASK = 0, |
|---|
| | 236 | DIVBYZERO_MASK = 0, |
|---|
| | 237 | INVALID_MASK = 0 |
|---|
| | 238 | } |
|---|
| 231 | 239 | } |
|---|
| 232 | 240 | private: |
|---|
| … | … | |
| 444 | 452 | vu[EXPONENTPOS_SHORT] = cast(ushort)((0x8000 & vu[EXPONENTPOS_SHORT]) | 0x3FFE); |
|---|
| 445 | 453 | } |
|---|
| 446 | | } else static if (real.mant_dig == 113) { |
|---|
| 447 | | // quadruple |
|---|
| | 454 | } else static if (real.mant_dig == 113) { // quadruple |
|---|
| 448 | 455 | if (ex) { // If exponent is non-zero |
|---|
| 449 | 456 | if (ex == EXPMASK) { // infinity or NaN |
|---|
| … | … | |
| 470 | 477 | // multi-byte left shift |
|---|
| 471 | 478 | vl[1]<<=1; |
|---|
| 472 | | if (*v1<0) ++vl[1]; |
|---|
| | 479 | if (*vl<0) ++vl[1]; |
|---|
| 473 | 480 | *vl <<= 1; |
|---|
| 474 | 481 | } while ((vl[1]&0x0000_8000_0000_0000)== 0); |
|---|
| … | … | |
| 476 | 483 | vu[EXPONENTPOS_SHORT] = cast(ushort)((0x8000 & vu[EXPONENTPOS_SHORT]) | 0x3FFE); |
|---|
| 477 | 484 | } |
|---|
| 478 | | } else static if(real.mant_dig==106) { // doubledouble |
|---|
| 479 | | assert(0, "Unsupported"); |
|---|
| 480 | | } else { // 64-bit reals |
|---|
| | 485 | } else static if (real.mant_dig==53) { // real is double |
|---|
| 481 | 486 | if (ex) { // If exponent is non-zero |
|---|
| 482 | 487 | if (ex == EXPMASK) { // infinity or NaN |
|---|
| … | … | |
| 510 | 515 | ve[EXPONENTPOS_SHORT] = sgn; |
|---|
| 511 | 516 | } |
|---|
| | 517 | }else { //static if(real.mant_dig==106) // doubledouble |
|---|
| | 518 | assert(0, "Unsupported"); |
|---|
| 512 | 519 | } |
|---|
| 513 | 520 | return value; |
|---|
| … | … | |
| 737 | 744 | } |
|---|
| 738 | 745 | } else { |
|---|
| 739 | | // BUG: Not implemented in DMD |
|---|
| | 746 | // NOTE: Not implemented in DMD |
|---|
| 740 | 747 | return tango.stdc.math.scalbnl(x, n); |
|---|
| 741 | 748 | } |
|---|
| … | … | |
| 903 | 910 | ushort *p = cast(ushort *)&d; |
|---|
| 904 | 911 | version(LittleEndian) { |
|---|
| 905 | | uint e = p[3] & 0x7FF0; |
|---|
| | 912 | ushort e = p[3] & 0x7FF0; |
|---|
| 906 | 913 | } else { |
|---|
| 907 | | uint e = p[0] & 0x7FF0; |
|---|
| | 914 | ushort e = p[0] & 0x7FF0; |
|---|
| 908 | 915 | } |
|---|
| 909 | 916 | return e!=0 && e != 0x7FF0; |
|---|
| … | … | |
| 1009 | 1016 | uint *p = cast(uint *)&f; |
|---|
| 1010 | 1017 | |
|---|
| 1011 | | return (*p & 0x7F800000) == 0 && *p & 0x007FFFFF; |
|---|
| | 1018 | return (*p & 0x7F80_0000) == 0 && *p & 0x007F_FFFF; |
|---|
| 1012 | 1019 | } |
|---|
| 1013 | 1020 | |
|---|
| … | … | |
| 1028 | 1035 | uint *p = cast(uint *)&d; |
|---|
| 1029 | 1036 | |
|---|
| 1030 | | return (p[1] & 0x7FF00000) == 0 && (p[0] || p[1] & 0x000FFFFF); |
|---|
| | 1037 | version(LittleEndian) { |
|---|
| | 1038 | return (p[1] & 0x7FF0_0000) == 0 && (p[0] || p[1] & 0x000F_FFFF); |
|---|
| | 1039 | } else { |
|---|
| | 1040 | return (p[0] & 0x7FF0_0000) == 0 && (p[1] || p[0] & 0x000F_FFFF); |
|---|
| | 1041 | } |
|---|
| 1031 | 1042 | } |
|---|
| 1032 | 1043 | |
|---|
| … | … | |
| 1077 | 1088 | return ((*cast(ulong *)&x) & 0x7FFF_FFFF_FFFF_FFFF) == 0; |
|---|
| 1078 | 1089 | } else static if (real.mant_dig == 113) { // quadruple |
|---|
| 1079 | | long* ps = cast(long *)&e; |
|---|
| 1080 | | return (ps[MANTISSA_LSB]==0 || (ps[MANTISSA_MSB]& 0x7FFF_FFFF_FFFF_FFFF) == 0); |
|---|
| | 1090 | long* ps = cast(long *)&x; |
|---|
| | 1091 | return (ps[MANTISSA_LSB] | (ps[MANTISSA_MSB]& 0x7FFF_FFFF_FFFF_FFFF)) == 0; |
|---|
| 1081 | 1092 | } else { // real80 |
|---|
| 1082 | 1093 | ushort* pe = cast(ushort *)&x; |
|---|
| … | … | |
| 1469 | 1480 | // they could have 0 or 1 bits in common. |
|---|
| 1470 | 1481 | |
|---|
| 1471 | | static if (real.mant_dig==64 || real.mant_dig==113) { // real64 |
|---|
| | 1482 | static if (real.mant_dig==64 || real.mant_dig==113) { // real80 or quadruple |
|---|
| 1472 | 1483 | int bitsdiff = ( ((pa[EXPONENTPOS_SHORT]&0x7FFF) + (pb[EXPONENTPOS_SHORT]&0x7FFF)-1)>>1) - pd[EXPONENTPOS_SHORT]; |
|---|
| 1473 | 1484 | |
|---|
| … | … | |
| 1486 | 1497 | // Avoid out-by-1 errors when factor is almost 2. |
|---|
| 1487 | 1498 | return (bitsdiff == 0) ? (pa[EXPONENTPOS_SHORT] == pb[EXPONENTPOS_SHORT]) : 0; |
|---|
| 1488 | | } else static if(real.mant_dig==106) { // doubledouble |
|---|
| 1489 | | assert(0, "Unsupported"); |
|---|
| 1490 | | } else { // real64 |
|---|
| | 1499 | } else static if(real.mant_dig==53) { // real is double |
|---|
| 1491 | 1500 | int bitsdiff = (( ((pa[EXPONENTPOS_SHORT]&0x7FF0) + (pb[EXPONENTPOS_SHORT]&0x7FF0)-0x10)>>1) |
|---|
| 1492 | 1501 | - (pd[EXPONENTPOS_SHORT]&0x7FF0))>>4; |
|---|
| … | … | |
| 1507 | 1516 | if (bitsdiff == 0 && !((pa[EXPONENTPOS_SHORT] ^ pb[EXPONENTPOS_SHORT])&EXPMASK)) return 1; |
|---|
| 1508 | 1517 | else return 0; |
|---|
| 1509 | | } |
|---|
| 1510 | | |
|---|
| | 1518 | } else { //static if(real.mant_dig==106) { // doubledouble |
|---|
| | 1519 | assert(0, "Unsupported"); |
|---|
| | 1520 | } |
|---|
| 1511 | 1521 | } |
|---|
| 1512 | 1522 | |
|---|
| … | … | |
| 1644 | 1654 | |
|---|
| 1645 | 1655 | T u; |
|---|
| 1646 | | static if (T.mant_dig==64) { // x87, 80-bit reals |
|---|
| | 1656 | static if (T.mant_dig==64) { // real80 |
|---|
| 1647 | 1657 | // There's slight additional complexity because they are actually |
|---|
| 1648 | 1658 | // 79-bit reals... |
|---|
| … | … | |
| 1653 | 1663 | ushort *ye = cast(ushort *)&y; |
|---|
| 1654 | 1664 | ulong *yl = cast(ulong *)&y; |
|---|
| 1655 | | // Ignore the useless implicit bit. |
|---|
| | 1665 | // Ignore the useless implicit bit. (Bonus: this prevents overflows) |
|---|
| 1656 | 1666 | ulong m = ((*xl) & 0x7FFF_FFFF_FFFF_FFFF) + ((*yl) & 0x7FFF_FFFF_FFFF_FFFF); |
|---|
| 1657 | 1667 | |
|---|
| … | … | |
| 1674 | 1684 | ulong *xl = cast(ulong *)&x; |
|---|
| 1675 | 1685 | ulong *yl = cast(ulong *)&y; |
|---|
| 1676 | | ulong m = (((*xl) & 0x7FFF_FFFF_FFFF_FFFF) + ((*yl) & 0x7FFF_FFFF_FFFF_FFFF)) >>> 1; |
|---|
| 1677 | | m |= ((*xl) & 0x8000_0000_0000_0000); |
|---|
| 1678 | | *ul = m; |
|---|
| | 1686 | // Multi-byte add, then multi-byte right shift. |
|---|
| | 1687 | ulong mh = ((xl[MANTISSA_MSB] & 0x7FFF_FFFF_FFFF_FFFF) + (yl[MANTISSA_MSB] & 0x7FFF_FFFF_FFFF_FFFF)); |
|---|
| | 1688 | ulong ml = (xl[MANTISSA_LSB]>>>1) + (yl[MANTISSA_LSB]>>>1); |
|---|
| | 1689 | if (xl[MANTISSA_LSB] & yl[MANTISSA_LSB]) { |
|---|
| | 1690 | ++ml; |
|---|
| | 1691 | if (ml==0) ++mh; |
|---|
| | 1692 | } |
|---|
| | 1693 | mh >>>=1; |
|---|
| | 1694 | ul[MANTISSA_MSB] = mh | (xl[MANTISSA_MSB] & 0x8000_0000_0000_0000); |
|---|
| | 1695 | ul[MANTISSA_LSB] = ml; |
|---|
| 1679 | 1696 | } else static if (T.mant_dig == double.mant_dig) { |
|---|
| 1680 | 1697 | ulong *ul = cast(ulong *)&u; |
|---|
| … | … | |
| 1684 | 1701 | m |= ((*xl) & 0x8000_0000_0000_0000); |
|---|
| 1685 | 1702 | *ul = m; |
|---|
| 1686 | | }else static if (T.mant_dig == float.mant_dig) { |
|---|
| | 1703 | } else static if (T.mant_dig == float.mant_dig) { |
|---|
| 1687 | 1704 | uint *ul = cast(uint *)&u; |
|---|
| 1688 | 1705 | uint *xl = cast(uint *)&x; |
|---|
| … | … | |
| 1691 | 1708 | m |= ((*xl) & 0x8000_0000); |
|---|
| 1692 | 1709 | *ul = m; |
|---|
| | 1710 | } else { |
|---|
| | 1711 | assert(0, "Not implemented"); |
|---|
| 1693 | 1712 | } |
|---|
| 1694 | 1713 | return u; |
|---|
| … | … | |
| 1732 | 1751 | real NaN(ulong payload) |
|---|
| 1733 | 1752 | { |
|---|
| 1734 | | static if (real.mant_dig == 53) { |
|---|
| | 1753 | static if (real.mant_dig == 64) { //real80 |
|---|
| | 1754 | ulong v = 3; // implied bit = 1, quiet bit = 1 |
|---|
| | 1755 | } else { |
|---|
| 1735 | 1756 | ulong v = 2; // no implied bit. quiet bit = 1 |
|---|
| 1736 | | } else { |
|---|
| 1737 | | ulong v = 3; // implied bit = 1, quiet bit = 1 |
|---|
| 1738 | 1757 | } |
|---|
| 1739 | 1758 | |
|---|
Download in other formats:
|
 |
 |
|
 |
Copyright © 2006-2008 Tango. All Rights Reserved. | Page Width:
Static or
Dynamic