Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Dragon4()

static unsafe uint System.Number.Dragon4 ( ulong mantissa,
int exponent,
uint mantissaHighBitIdx,
bool hasUnequalMargins,
int cutoffNumber,
bool isSignificantDigits,
Span< byte > buffer,
out int decimalExponent )
inlinestaticprivate

Definition at line 1335 of file Number.cs.

1336 {
1337 int num = 0;
1338 BigInteger lhs;
1339 BigInteger rhs;
1340 BigInteger result;
1341 BigInteger* ptr;
1342 if (hasUnequalMargins)
1343 {
1344 BigInteger result2;
1345 if (exponent > 0)
1346 {
1347 BigInteger.SetUInt64(out lhs, 4 * mantissa);
1348 lhs.ShiftLeft((uint)exponent);
1349 BigInteger.SetUInt32(out rhs, 4u);
1350 BigInteger.Pow2((uint)exponent, out result);
1351 BigInteger.Pow2((uint)(exponent + 1), out result2);
1352 }
1353 else
1354 {
1355 BigInteger.SetUInt64(out lhs, 4 * mantissa);
1356 BigInteger.Pow2((uint)(-exponent + 2), out rhs);
1357 BigInteger.SetUInt32(out result, 1u);
1358 BigInteger.SetUInt32(out result2, 2u);
1359 }
1360 ptr = &result2;
1361 }
1362 else
1363 {
1364 if (exponent > 0)
1365 {
1366 BigInteger.SetUInt64(out lhs, 2 * mantissa);
1367 lhs.ShiftLeft((uint)exponent);
1368 BigInteger.SetUInt32(out rhs, 2u);
1369 BigInteger.Pow2((uint)exponent, out result);
1370 }
1371 else
1372 {
1373 BigInteger.SetUInt64(out lhs, 2 * mantissa);
1374 BigInteger.Pow2((uint)(-exponent + 1), out rhs);
1375 BigInteger.SetUInt32(out result, 1u);
1376 }
1377 ptr = &result;
1378 }
1379 int num2 = (int)Math.Ceiling((double)((int)mantissaHighBitIdx + exponent) * 0.3010299956639812 - 0.69);
1380 if (num2 > 0)
1381 {
1382 rhs.MultiplyPow10((uint)num2);
1383 }
1384 else if (num2 < 0)
1385 {
1386 BigInteger.Pow10((uint)(-num2), out var result3);
1387 lhs.Multiply(ref result3);
1388 result.Multiply(ref result3);
1389 if (ptr != &result)
1390 {
1391 BigInteger.Multiply(ref result, 2u, out *ptr);
1392 }
1393 }
1394 bool flag = mantissa % 2 == 0;
1395 bool flag2 = false;
1396 if (cutoffNumber == -1)
1397 {
1398 BigInteger.Add(ref lhs, ref *ptr, out var result4);
1399 int num3 = BigInteger.Compare(ref result4, ref rhs);
1400 flag2 = (flag ? (num3 >= 0) : (num3 > 0));
1401 }
1402 else
1403 {
1404 flag2 = BigInteger.Compare(ref lhs, ref rhs) >= 0;
1405 }
1406 if (flag2)
1407 {
1408 num2++;
1409 }
1410 else
1411 {
1412 lhs.Multiply10();
1413 result.Multiply10();
1414 if (ptr != &result)
1415 {
1416 BigInteger.Multiply(ref result, 2u, out *ptr);
1417 }
1418 }
1419 int num4 = num2 - buffer.Length;
1420 if (cutoffNumber != -1)
1421 {
1422 int num5 = 0;
1423 num5 = ((!isSignificantDigits) ? (-cutoffNumber) : (num2 - cutoffNumber));
1424 if (num5 > num4)
1425 {
1426 num4 = num5;
1427 }
1428 }
1429 num2 = (decimalExponent = num2 - 1);
1430 uint block = rhs.GetBlock((uint)(rhs.GetLength() - 1));
1431 if (block < 8 || block > 429496729)
1432 {
1433 uint num6 = (uint)BitOperations.Log2(block);
1434 uint shift = (59 - num6) % 32;
1435 rhs.ShiftLeft(shift);
1436 lhs.ShiftLeft(shift);
1437 result.ShiftLeft(shift);
1438 if (ptr != &result)
1439 {
1440 BigInteger.Multiply(ref result, 2u, out *ptr);
1441 }
1442 }
1443 bool flag3;
1444 bool flag4;
1445 uint num7;
1446 if (cutoffNumber == -1)
1447 {
1448 while (true)
1449 {
1450 num7 = BigInteger.HeuristicDivide(ref lhs, ref rhs);
1451 BigInteger.Add(ref lhs, ref *ptr, out var result5);
1452 int num8 = BigInteger.Compare(ref lhs, ref result);
1453 int num9 = BigInteger.Compare(ref result5, ref rhs);
1454 if (flag)
1455 {
1456 flag3 = num8 <= 0;
1457 flag4 = num9 >= 0;
1458 }
1459 else
1460 {
1461 flag3 = num8 < 0;
1462 flag4 = num9 > 0;
1463 }
1464 if (flag3 || flag4 || num2 == num4)
1465 {
1466 break;
1467 }
1468 buffer[num] = (byte)(48 + num7);
1469 num++;
1470 lhs.Multiply10();
1471 result.Multiply10();
1472 if (ptr != &result)
1473 {
1474 BigInteger.Multiply(ref result, 2u, out *ptr);
1475 }
1476 num2--;
1477 }
1478 }
1479 else
1480 {
1481 if (num2 < num4)
1482 {
1483 num7 = BigInteger.HeuristicDivide(ref lhs, ref rhs);
1484 if (num7 > 5 || (num7 == 5 && !lhs.IsZero()))
1485 {
1486 decimalExponent++;
1487 num7 = 1u;
1488 }
1489 buffer[num] = (byte)(48 + num7);
1490 return (uint)(num + 1);
1491 }
1492 flag3 = false;
1493 flag4 = false;
1494 while (true)
1495 {
1496 num7 = BigInteger.HeuristicDivide(ref lhs, ref rhs);
1497 if (lhs.IsZero() || num2 <= num4)
1498 {
1499 break;
1500 }
1501 buffer[num] = (byte)(48 + num7);
1502 num++;
1503 lhs.Multiply10();
1504 num2--;
1505 }
1506 }
1507 bool flag5 = flag3;
1508 if (flag3 == flag4)
1509 {
1510 lhs.ShiftLeft(1u);
1511 int num10 = BigInteger.Compare(ref lhs, ref rhs);
1512 flag5 = num10 < 0;
1513 if (num10 == 0)
1514 {
1515 flag5 = (num7 & 1) == 0;
1516 }
1517 }
1518 if (flag5)
1519 {
1520 buffer[num] = (byte)(48 + num7);
1521 num++;
1522 }
1523 else if (num7 == 9)
1524 {
1525 while (true)
1526 {
1527 if (num == 0)
1528 {
1529 buffer[num] = 49;
1530 num++;
1531 decimalExponent++;
1532 break;
1533 }
1534 num--;
1535 if (buffer[num] != 57)
1536 {
1537 buffer[num]++;
1538 num++;
1539 break;
1540 }
1541 }
1542 }
1543 else
1544 {
1545 buffer[num] = (byte)(48 + num7 + 1);
1546 num++;
1547 }
1548 return (uint)num;
1549 }
static int Log2(uint value)
static int Compare(BigInteger left, BigInteger right)
static BigInteger Multiply(BigInteger left, BigInteger right)
static BigInteger Add(BigInteger left, BigInteger right)

References System.Number.BigInteger.Add(), System.buffer, System.Math.Ceiling(), System.Number.BigInteger.Compare(), System.Number.BigInteger.GetBlock(), System.Number.BigInteger.GetLength(), System.Number.BigInteger.HeuristicDivide(), System.Numerics.BitOperations.Log2(), System.Number.BigInteger.Multiply(), System.Number.BigInteger.Multiply10(), System.Number.BigInteger.MultiplyPow10(), System.Number.BigInteger.Pow10(), System.Number.BigInteger.Pow2(), System.Number.BigInteger.SetUInt32(), System.Number.BigInteger.SetUInt64(), and System.Number.BigInteger.ShiftLeft().

Referenced by System.Number.Dragon4Double(), System.Number.Dragon4Half(), and System.Number.Dragon4Single().