/src/main/java/com/alibaba/fastjson/util/RyuDouble.java

https://github.com/alibaba/fastjson · Java · 580 lines · 494 code · 37 blank · 49 comment · 178 complexity · d91f451ec15ce2c057ed18d1b617c0b7 MD5 · raw file

  1. // Copyright 2018 Ulf Adams
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package com.alibaba.fastjson.util;
  15. import java.math.BigInteger;
  16. /**
  17. * An implementation of Ryu for double.
  18. */
  19. public final class RyuDouble {
  20. private static final int[][] POW5_SPLIT = new int[326][4];
  21. private static final int[][] POW5_INV_SPLIT = new int[291][4];
  22. static {
  23. BigInteger mask = BigInteger.ONE.shiftLeft(31).subtract(BigInteger.ONE);
  24. BigInteger invMask = BigInteger.ONE.shiftLeft(31).subtract(BigInteger.ONE);
  25. for (int i = 0; i < 326; i++) {
  26. BigInteger pow = BigInteger.valueOf(5).pow(i);
  27. int pow5len = pow.bitLength();
  28. int expectedPow5Bits = i == 0 ? 1 : (int) ((i * 23219280L + 10000000L - 1) / 10000000L);
  29. if (expectedPow5Bits != pow5len) {
  30. throw new IllegalStateException(pow5len + " != " + expectedPow5Bits);
  31. }
  32. if (i < POW5_SPLIT.length) {
  33. for (int j = 0; j < 4; j++) {
  34. POW5_SPLIT[i][j] = pow
  35. .shiftRight(pow5len - 121 + (3 - j) * 31)
  36. .and(mask)
  37. .intValue();
  38. }
  39. }
  40. if (i < POW5_INV_SPLIT.length) {
  41. // We want floor(log_2 5^q) here, which is pow5len - 1.
  42. int j = pow5len + 121;
  43. BigInteger inv = BigInteger.ONE
  44. .shiftLeft(j)
  45. .divide(pow)
  46. .add(BigInteger.ONE);
  47. for (int k = 0; k < 4; k++) {
  48. if (k == 0) {
  49. POW5_INV_SPLIT[i][k] = inv
  50. .shiftRight((3 - k) * 31)
  51. .intValue();
  52. } else {
  53. POW5_INV_SPLIT[i][k] = inv
  54. .shiftRight((3 - k) * 31)
  55. .and(invMask)
  56. .intValue();
  57. }
  58. }
  59. }
  60. }
  61. }
  62. public static String toString(double value) {
  63. char[] result = new char[24];
  64. int len = toString(value, result, 0);
  65. return new String(result, 0, len);
  66. }
  67. public static int toString(double value, char[] result, int off) {
  68. final long DOUBLE_MANTISSA_MASK = 4503599627370495L; // (1L << 52) - 1;
  69. final int DOUBLE_EXPONENT_MASK = 2047; // (1 << 11) - 1;
  70. final int DOUBLE_EXPONENT_BIAS = 1023; // (1 << (11 - 1)) - 1;
  71. final long LOG10_5_NUMERATOR = 6989700L; // (long) (10000000L * Math.log10(5));
  72. final long LOG10_2_NUMERATOR = 3010299L; // (long) (10000000L * Math.log10(2));
  73. // Step 1: Decode the floating point number, and unify normalized and subnormal cases.
  74. // First, handle all the trivial cases.
  75. int index = off;
  76. if (Double.isNaN(value)) {
  77. result[index++] = 'N';
  78. result[index++] = 'a';
  79. result[index++] = 'N';
  80. return index - off;
  81. }
  82. if (value == Double.POSITIVE_INFINITY) {
  83. result[index++] = 'I';
  84. result[index++] = 'n';
  85. result[index++] = 'f';
  86. result[index++] = 'i';
  87. result[index++] = 'n';
  88. result[index++] = 'i';
  89. result[index++] = 't';
  90. result[index++] = 'y';
  91. return index - off;
  92. }
  93. if (value == Double.NEGATIVE_INFINITY) {
  94. result[index++] = '-';
  95. result[index++] = 'I';
  96. result[index++] = 'n';
  97. result[index++] = 'f';
  98. result[index++] = 'i';
  99. result[index++] = 'n';
  100. result[index++] = 'i';
  101. result[index++] = 't';
  102. result[index++] = 'y';
  103. return index - off;
  104. }
  105. long bits = Double.doubleToLongBits(value);
  106. if (bits == 0) {
  107. result[index++] = '0';
  108. result[index++] = '.';
  109. result[index++] = '0';
  110. return index - off;
  111. }
  112. if (bits == 0x8000000000000000L) {
  113. result[index++] = '-';
  114. result[index++] = '0';
  115. result[index++] = '.';
  116. result[index++] = '0';
  117. return index - off;
  118. }
  119. final int DOUBLE_MANTISSA_BITS = 52;
  120. // Otherwise extract the mantissa and exponent bits and run the full algorithm.
  121. int ieeeExponent = (int) ((bits >>> DOUBLE_MANTISSA_BITS) & DOUBLE_EXPONENT_MASK);
  122. long ieeeMantissa = bits & DOUBLE_MANTISSA_MASK;
  123. int e2;
  124. long m2;
  125. if (ieeeExponent == 0) {
  126. // Denormal number - no implicit leading 1, and the exponent is 1, not 0.
  127. e2 = 1 - DOUBLE_EXPONENT_BIAS - DOUBLE_MANTISSA_BITS;
  128. m2 = ieeeMantissa;
  129. } else {
  130. // Add implicit leading 1.
  131. e2 = ieeeExponent - DOUBLE_EXPONENT_BIAS - DOUBLE_MANTISSA_BITS;
  132. m2 = ieeeMantissa | (1L << DOUBLE_MANTISSA_BITS);
  133. }
  134. boolean sign = bits < 0;
  135. // Step 2: Determine the interval of legal decimal representations.
  136. boolean even = (m2 & 1) == 0;
  137. final long mv = 4 * m2;
  138. final long mp = 4 * m2 + 2;
  139. final int mmShift = ((m2 != (1L << DOUBLE_MANTISSA_BITS)) || (ieeeExponent <= 1)) ? 1 : 0;
  140. final long mm = 4 * m2 - 1 - mmShift;
  141. e2 -= 2;
  142. // Step 3: Convert to a decimal power base using 128-bit arithmetic.
  143. // -1077 = 1 - 1023 - 53 - 2 <= e_2 - 2 <= 2046 - 1023 - 53 - 2 = 968
  144. long dv, dp, dm;
  145. final int e10;
  146. boolean dmIsTrailingZeros = false, dvIsTrailingZeros = false;
  147. if (e2 >= 0) {
  148. final int q = Math.max(0, (int) (e2 * LOG10_2_NUMERATOR / 10000000L) - 1);
  149. // k = constant + floor(log_2(5^q))
  150. // q == 0 ? 1 : (int) ((q * 23219280L + 10000000L - 1) / 10000000L)
  151. final int k = 122 + (q == 0 ? 1 : (int) ((q * 23219280L + 10000000L - 1) / 10000000L)) - 1;
  152. final int i = -e2 + q + k;
  153. int actualShift = i - 3 * 31 - 21;
  154. if (actualShift < 0) {
  155. throw new IllegalArgumentException("" + actualShift);
  156. }
  157. final int[] ints = POW5_INV_SPLIT[q];
  158. {
  159. long mHigh = mv >>> 31;
  160. long mLow = mv & 0x7fffffff;
  161. long bits13 = mHigh * ints[0];
  162. long bits03 = mLow * ints[0];
  163. long bits12 = mHigh * ints[1];
  164. long bits02 = mLow * ints[1];
  165. long bits11 = mHigh * ints[2];
  166. long bits01 = mLow * ints[2];
  167. long bits10 = mHigh * ints[3];
  168. long bits00 = mLow * ints[3];
  169. dv = ((((((
  170. ((bits00 >>> 31) + bits01 + bits10) >>> 31)
  171. + bits02 + bits11) >>> 31)
  172. + bits03 + bits12) >>> 21)
  173. + (bits13 << 10)) >>> actualShift;
  174. }
  175. {
  176. long mHigh = mp >>> 31;
  177. long mLow = mp & 0x7fffffff;
  178. long bits13 = mHigh * ints[0];
  179. long bits03 = mLow * ints[0];
  180. long bits12 = mHigh * ints[1];
  181. long bits02 = mLow * ints[1];
  182. long bits11 = mHigh * ints[2];
  183. long bits01 = mLow * ints[2];
  184. long bits10 = mHigh * ints[3];
  185. long bits00 = mLow * ints[3];
  186. dp = ((((((
  187. ((bits00 >>> 31) + bits01 + bits10) >>> 31)
  188. + bits02 + bits11) >>> 31)
  189. + bits03 + bits12) >>> 21)
  190. + (bits13 << 10)) >>> actualShift;
  191. }
  192. {
  193. long mHigh = mm >>> 31;
  194. long mLow = mm & 0x7fffffff;
  195. long bits13 = mHigh * ints[0];
  196. long bits03 = mLow * ints[0];
  197. long bits12 = mHigh * ints[1];
  198. long bits02 = mLow * ints[1];
  199. long bits11 = mHigh * ints[2];
  200. long bits01 = mLow * ints[2];
  201. long bits10 = mHigh * ints[3];
  202. long bits00 = mLow * ints[3];
  203. dm = ((((((
  204. ((bits00 >>> 31) + bits01 + bits10) >>> 31)
  205. + bits02 + bits11) >>> 31)
  206. + bits03 + bits12) >>> 21)
  207. + (bits13 << 10)) >>> actualShift;
  208. }
  209. e10 = q;
  210. if (q <= 21) {
  211. if (mv % 5 == 0) {
  212. int pow5Factor_mv;
  213. {
  214. long v = mv;
  215. if ((v % 5) != 0) {
  216. pow5Factor_mv = 0;
  217. } else if ((v % 25) != 0) {
  218. pow5Factor_mv = 1;
  219. } else if ((v % 125) != 0) {
  220. pow5Factor_mv = 2;
  221. } else if ((v % 625) != 0) {
  222. pow5Factor_mv = 3;
  223. } else {
  224. pow5Factor_mv = 4;
  225. v /= 625;
  226. while (v > 0) {
  227. if (v % 5 != 0) {
  228. break;
  229. }
  230. v /= 5;
  231. pow5Factor_mv++;
  232. }
  233. }
  234. }
  235. dvIsTrailingZeros = pow5Factor_mv >= q;
  236. } else if (even) {
  237. int pow5Factor_mm;
  238. {
  239. long v = mm;
  240. if ((v % 5) != 0) {
  241. pow5Factor_mm = 0;
  242. } else if ((v % 25) != 0) {
  243. pow5Factor_mm = 1;
  244. } else if ((v % 125) != 0) {
  245. pow5Factor_mm = 2;
  246. } else if ((v % 625) != 0) {
  247. pow5Factor_mm = 3;
  248. } else {
  249. pow5Factor_mm = 4;
  250. v /= 625;
  251. while (v > 0) {
  252. if (v % 5 != 0) {
  253. break;
  254. }
  255. v /= 5;
  256. pow5Factor_mm++;
  257. }
  258. }
  259. }
  260. dmIsTrailingZeros = pow5Factor_mm >= q; //
  261. } else {
  262. int pow5Factor_mp;
  263. {
  264. long v = mp;
  265. if ((v % 5) != 0) {
  266. pow5Factor_mp = 0;
  267. } else if ((v % 25) != 0) {
  268. pow5Factor_mp = 1;
  269. } else if ((v % 125) != 0) {
  270. pow5Factor_mp = 2;
  271. } else if ((v % 625) != 0) {
  272. pow5Factor_mp = 3;
  273. } else {
  274. pow5Factor_mp = 4;
  275. v /= 625;
  276. while (v > 0) {
  277. if (v % 5 != 0) {
  278. break;
  279. }
  280. v /= 5;
  281. pow5Factor_mp++;
  282. }
  283. }
  284. }
  285. if (pow5Factor_mp >= q) {
  286. dp--;
  287. }
  288. }
  289. }
  290. } else {
  291. final int q = Math.max(0, (int) (-e2 * LOG10_5_NUMERATOR / 10000000L) - 1);
  292. final int i = -e2 - q;
  293. final int k = (i == 0 ? 1 : (int) ((i * 23219280L + 10000000L - 1) / 10000000L)) - 121;
  294. final int j = q - k;
  295. int actualShift = j - 3 * 31 - 21;
  296. if (actualShift < 0) {
  297. throw new IllegalArgumentException("" + actualShift);
  298. }
  299. int[] ints = POW5_SPLIT[i];
  300. {
  301. long mHigh = mv >>> 31;
  302. long mLow = mv & 0x7fffffff;
  303. long bits13 = mHigh * ints[0]; // 124
  304. long bits03 = mLow * ints[0]; // 93
  305. long bits12 = mHigh * ints[1]; // 93
  306. long bits02 = mLow * ints[1]; // 62
  307. long bits11 = mHigh * ints[2]; // 62
  308. long bits01 = mLow * ints[2]; // 31
  309. long bits10 = mHigh * ints[3]; // 31
  310. long bits00 = mLow * ints[3]; // 0
  311. dv = ((((((
  312. ((bits00 >>> 31) + bits01 + bits10) >>> 31)
  313. + bits02 + bits11) >>> 31)
  314. + bits03 + bits12) >>> 21)
  315. + (bits13 << 10)) >>> actualShift;
  316. }
  317. {
  318. long mHigh = mp >>> 31;
  319. long mLow = mp & 0x7fffffff;
  320. long bits13 = mHigh * ints[0]; // 124
  321. long bits03 = mLow * ints[0]; // 93
  322. long bits12 = mHigh * ints[1]; // 93
  323. long bits02 = mLow * ints[1]; // 62
  324. long bits11 = mHigh * ints[2]; // 62
  325. long bits01 = mLow * ints[2]; // 31
  326. long bits10 = mHigh * ints[3]; // 31
  327. long bits00 = mLow * ints[3]; // 0
  328. dp = ((((((
  329. ((bits00 >>> 31) + bits01 + bits10) >>> 31)
  330. + bits02 + bits11) >>> 31)
  331. + bits03 + bits12) >>> 21)
  332. + (bits13 << 10)) >>> actualShift;
  333. }
  334. {
  335. long mHigh = mm >>> 31;
  336. long mLow = mm & 0x7fffffff;
  337. long bits13 = mHigh * ints[0]; // 124
  338. long bits03 = mLow * ints[0]; // 93
  339. long bits12 = mHigh * ints[1]; // 93
  340. long bits02 = mLow * ints[1]; // 62
  341. long bits11 = mHigh * ints[2]; // 62
  342. long bits01 = mLow * ints[2]; // 31
  343. long bits10 = mHigh * ints[3]; // 31
  344. long bits00 = mLow * ints[3]; // 0
  345. dm = ((((((
  346. ((bits00 >>> 31) + bits01 + bits10) >>> 31)
  347. + bits02 + bits11) >>> 31)
  348. + bits03 + bits12) >>> 21)
  349. + (bits13 << 10)) >>> actualShift;
  350. }
  351. e10 = q + e2;
  352. if (q <= 1) {
  353. dvIsTrailingZeros = true;
  354. if (even) {
  355. dmIsTrailingZeros = mmShift == 1;
  356. } else {
  357. dp--;
  358. }
  359. } else if (q < 63) {
  360. dvIsTrailingZeros = (mv & ((1L << (q - 1)) - 1)) == 0;
  361. }
  362. }
  363. // Step 4: Find the shortest decimal representation in the interval of legal representations.
  364. //
  365. // We do some extra work here in order to follow Float/Double.toString semantics. In particular,
  366. // that requires printing in scientific format if and only if the exponent is between -3 and 7,
  367. // and it requires printing at least two decimal digits.
  368. //
  369. // Above, we moved the decimal dot all the way to the right, so now we need to count digits to
  370. // figure out the correct exponent for scientific notation.
  371. final int vplength; // = decimalLength(dp);
  372. if (dp >= 1000000000000000000L) {
  373. vplength= 19;
  374. } else if (dp >= 100000000000000000L) {
  375. vplength= 18;
  376. } else if (dp >= 10000000000000000L) {
  377. vplength = 17;
  378. } else if (dp >= 1000000000000000L) {
  379. vplength = 16;
  380. } else if (dp >= 100000000000000L) {
  381. vplength = 15;
  382. } else if (dp >= 10000000000000L) {
  383. vplength = 14;
  384. } else if (dp >= 1000000000000L) {
  385. vplength = 13;
  386. } else if (dp >= 100000000000L) {
  387. vplength = 12;
  388. } else if (dp >= 10000000000L) {
  389. vplength = 11;
  390. } else if (dp >= 1000000000L) {
  391. vplength = 10;
  392. } else if (dp >= 100000000L) {
  393. vplength = 9;
  394. } else if (dp >= 10000000L) {
  395. vplength = 8;
  396. } else if (dp >= 1000000L) {
  397. vplength = 7;
  398. } else if (dp >= 100000L) {
  399. vplength = 6;
  400. } else if (dp >= 10000L) {
  401. vplength = 5;
  402. } else if (dp >= 1000L) {
  403. vplength = 4;
  404. } else if (dp >= 100L) {
  405. vplength = 3;
  406. } else if (dp >= 10L) {
  407. vplength = 2;
  408. } else {
  409. vplength = 1;
  410. }
  411. int exp = e10 + vplength - 1;
  412. // Double.toString semantics requires using scientific notation if and only if outside this range.
  413. boolean scientificNotation = !((exp >= -3) && (exp < 7));
  414. int removed = 0;
  415. int lastRemovedDigit = 0;
  416. long output;
  417. if (dmIsTrailingZeros || dvIsTrailingZeros) {
  418. while (dp / 10 > dm / 10) {
  419. if ((dp < 100) && scientificNotation) {
  420. // Double.toString semantics requires printing at least two digits.
  421. break;
  422. }
  423. dmIsTrailingZeros &= dm % 10 == 0;
  424. dvIsTrailingZeros &= lastRemovedDigit == 0;
  425. lastRemovedDigit = (int) (dv % 10);
  426. dp /= 10;
  427. dv /= 10;
  428. dm /= 10;
  429. removed++;
  430. }
  431. if (dmIsTrailingZeros && even) {
  432. while (dm % 10 == 0) {
  433. if ((dp < 100) && scientificNotation) {
  434. // Double.toString semantics requires printing at least two digits.
  435. break;
  436. }
  437. dvIsTrailingZeros &= lastRemovedDigit == 0;
  438. lastRemovedDigit = (int) (dv % 10);
  439. dp /= 10;
  440. dv /= 10;
  441. dm /= 10;
  442. removed++;
  443. }
  444. }
  445. if (dvIsTrailingZeros && (lastRemovedDigit == 5) && (dv % 2 == 0)) {
  446. // Round even if the exact numbers is .....50..0.
  447. lastRemovedDigit = 4;
  448. }
  449. output = dv +
  450. ((dv == dm && !(dmIsTrailingZeros && even)) || (lastRemovedDigit >= 5) ? 1 : 0);
  451. } else {
  452. while (dp / 10 > dm / 10) {
  453. if ((dp < 100) && scientificNotation) {
  454. // Double.toString semantics requires printing at least two digits.
  455. break;
  456. }
  457. lastRemovedDigit = (int) (dv % 10);
  458. dp /= 10;
  459. dv /= 10;
  460. dm /= 10;
  461. removed++;
  462. }
  463. output = dv + ((dv == dm || (lastRemovedDigit >= 5)) ? 1 : 0);
  464. }
  465. int olength = vplength - removed;
  466. // Step 5: Print the decimal representation.
  467. // We follow Double.toString semantics here.
  468. if (sign) {
  469. result[index++] = '-';
  470. }
  471. // Values in the interval [1E-3, 1E7) are special.
  472. if (scientificNotation) {
  473. // Print in the format x.xxxxxE-yy.
  474. for (int i = 0; i < olength - 1; i++) {
  475. int c = (int) (output % 10);
  476. output /= 10;
  477. result[index + olength - i] = (char) ('0' + c);
  478. }
  479. result[index] = (char) ('0' + output % 10);
  480. result[index + 1] = '.';
  481. index += olength + 1;
  482. if (olength == 1) {
  483. result[index++] = '0';
  484. }
  485. // Print 'E', the exponent sign, and the exponent, which has at most three digits.
  486. result[index++] = 'E';
  487. if (exp < 0) {
  488. result[index++] = '-';
  489. exp = -exp;
  490. }
  491. if (exp >= 100) {
  492. result[index++] = (char) ('0' + exp / 100);
  493. exp %= 100;
  494. result[index++] = (char) ('0' + exp / 10);
  495. } else if (exp >= 10) {
  496. result[index++] = (char) ('0' + exp / 10);
  497. }
  498. result[index++] = (char) ('0' + exp % 10);
  499. return index - off;
  500. } else {
  501. // Otherwise follow the Java spec for values in the interval [1E-3, 1E7).
  502. if (exp < 0) {
  503. // Decimal dot is before any of the digits.
  504. result[index++] = '0';
  505. result[index++] = '.';
  506. for (int i = -1; i > exp; i--) {
  507. result[index++] = '0';
  508. }
  509. int current = index;
  510. for (int i = 0; i < olength; i++) {
  511. result[current + olength - i - 1] = (char) ('0' + output % 10);
  512. output /= 10;
  513. index++;
  514. }
  515. } else if (exp + 1 >= olength) {
  516. // Decimal dot is after any of the digits.
  517. for (int i = 0; i < olength; i++) {
  518. result[index + olength - i - 1] = (char) ('0' + output % 10);
  519. output /= 10;
  520. }
  521. index += olength;
  522. for (int i = olength; i < exp + 1; i++) {
  523. result[index++] = '0';
  524. }
  525. result[index++] = '.';
  526. result[index++] = '0';
  527. } else {
  528. // Decimal dot is somewhere between the digits.
  529. int current = index + 1;
  530. for (int i = 0; i < olength; i++) {
  531. if (olength - i - 1 == exp) {
  532. result[current + olength - i - 1] = '.';
  533. current--;
  534. }
  535. result[current + olength - i - 1] = (char) ('0' + output % 10);
  536. output /= 10;
  537. }
  538. index += olength + 1;
  539. }
  540. return index - off;
  541. }
  542. }
  543. }