static void BigDecimalLog() { Console.WindowWidth = 122; BigDecimal.SetPrecision(116); Console.WriteLine("Constants:"); Console.WriteLine($"π = {BigDecimal.PI}"); Console.WriteLine($"e = {BigDecimal.E}"); Console.WriteLine($"φ = {BigDecimal.GoldenRatio}"); BigDecimal.SetPrecision(88); BigDecimal x = BigDecimal.Exp(BigDecimal.E); Console.WriteLine($"\nFunctions:"); Console.WriteLine($"x = {x}"); Console.WriteLine($"Function name | Value | Average time"); Console.WriteLine($"Ln(x) | {BigDecimal.Ln(x).ToString().PadRight(2, '.').PadRight(90, '0').Remove(89),89} | {MeasureTime(() => BigDecimal.Ln(x)).TotalMilliseconds,10:0.000}ms"); Console.WriteLine($"Ln(Ln(x)) | {BigDecimal.Ln(BigDecimal.Ln(x)).ToString().PadRight(2, '.').PadRight(90, '0').Remove(89),89} | {MeasureTime(() => BigDecimal.Ln(BigDecimal.Ln(x))).TotalMilliseconds,10:0.000}ms"); Console.WriteLine($"Exp(x) | {BigDecimal.Exp(x).ToString().PadRight(2, '.').PadRight(90, '0').Remove(89),89} | {MeasureTime(() => BigDecimal.Exp(x)).TotalMilliseconds,10:0.000}ms"); Console.WriteLine($"Pow(x, x) | {BigDecimal.Pow(x, x).ToString().PadRight(2, '.').PadRight(90, '0').Remove(89),89} | {MeasureTime(() => BigDecimal.Pow(x, x)).TotalMilliseconds,10:0.000}ms"); x = BigDecimal.PI / 4; Console.WriteLine($"\nx = {x}"); Console.WriteLine($"Function name | Value | Average time"); Console.WriteLine($"Sin(x) | {BigDecimal.Sin(x).ToString().PadRight(2, '.').PadRight(90, '0').Remove(89),89} | {MeasureTime(() => BigDecimal.Sin(x)).TotalMilliseconds,10:0.000}ms"); Console.WriteLine($"Cos(x) | {BigDecimal.Cos(x).ToString().PadRight(2, '.').PadRight(90, '0').Remove(89),89} | {MeasureTime(() => BigDecimal.Cos(x)).TotalMilliseconds,10:0.000}ms"); Console.WriteLine($"Tg(x) | {BigDecimal.Tg(x).ToString().PadRight(2, '.').PadRight(90, '0').Remove(89),89} | {MeasureTime(() => BigDecimal.Tg(x)).TotalMilliseconds,10:0.000}ms"); Console.WriteLine($"Ctg(x) | {BigDecimal.Ctg(x).ToString().PadRight(2, '.').PadRight(90, '0').Remove(89),89} | {MeasureTime(() => BigDecimal.Ctg(x)).TotalMilliseconds,10:0.000}ms"); Console.WriteLine($"Arcsin(sin(x)) | {BigDecimal.ArcSin(BigDecimal.Sin(x)).ToString().PadRight(2, '.').PadRight(90, '0').Remove(89),89} | {MeasureTime(() => BigDecimal.ArcSin(BigDecimal.Sin(x))).TotalMilliseconds,10:0.000}ms"); Console.WriteLine($"Arccos(cos(x)) | {BigDecimal.ArcCos(BigDecimal.Cos(x)).ToString().PadRight(2, '.').PadRight(90, '0').Remove(89),89} | {MeasureTime(() => BigDecimal.ArcCos(BigDecimal.Cos(x))).TotalMilliseconds,10:0.000}ms"); decimal[] Decimals = new decimal[7] { decimal.MinusOne, decimal.Zero, decimal.One, decimal.MinValue, decimal.MaxValue, new decimal(1, 0, 0, true, 28), new decimal(1, 0, 0, false, 28) }; BigDecimal.SetPrecision(32); Console.WriteLine($"\n{"Convertation:",-15}| {typeof(decimal),-32} | {typeof(BigDecimal),-32} | {typeof(decimal),-32}"); foreach (decimal d in Decimals) { Console.WriteLine(BigDecimalConvertLog(d)); } double[] Doubles = new double[5] { -1d, 0d, 1d, // double.MinValue, // No support for scientific notation yet // double.MaxValue, // Too long values -double.Epsilon, double.Epsilon }; Console.WriteLine($"\n{"Convertation:",-15}| {typeof(double),-32} | {typeof(BigDecimal),-32} | {typeof(double),-32}"); foreach (double d in Doubles) { Console.WriteLine(BigDecimalConvertLog(d)); } }
public void Exponential1Test() { Assert.AreEqual(new BigDecimal("2.7182818284"), BigDecimal.Exp(1, 10)); }
public void TestTruncateOnAllArithmeticOperations() { var savePrecision = BigDecimal.Precision; BigDecimal mod1 = BigDecimal.Parse("3141592653589793238462643383279502"); BigDecimal mod2 = BigDecimal.Parse("27182818284590452"); BigDecimal neg1 = BigDecimal.Parse("-3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647"); BigDecimal lrg1 = BigDecimal.Parse("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647"); BigDecimal lrg2 = BigDecimal.Parse("2.718281828459045235360287471352662497757247093699959574966967"); var expected1 = "5.859874482"; var expected2 = "0.4233108251"; var expected3 = "8.5397342226"; var expected4 = "0.8652559794"; var expected5 = "9.869604401"; var expected6 = "148.4131591"; var expected7 = "8003077319547306"; var expected8 = "-3.1415926535"; var expected9 = "3"; var expected10 = "4"; var expected11 = "3.1415926535"; var actual1 = ""; var actual2 = ""; var actual3 = ""; var actual4 = ""; var actual5 = ""; var actual6 = ""; var actual7 = ""; var actual8 = ""; var actual9 = ""; var actual10 = ""; var actual11 = ""; try { BigDecimal.Precision = 10; BigDecimal.AlwaysTruncate = true; TestContext.WriteLine($"E = {BigDecimal.E}"); TestContext.WriteLine($"{new BigDecimal(lrg1.Mantissa, lrg1.Exponent)}"); TestContext.WriteLine($"{new BigDecimal(lrg2.Mantissa, lrg2.Exponent)}"); BigDecimal result1 = BigDecimal.Add(lrg1, lrg2); BigDecimal result2 = BigDecimal.Subtract(lrg1, lrg2); BigDecimal result3 = BigDecimal.Multiply(lrg1, lrg2); BigDecimal result4 = BigDecimal.Divide(lrg2, lrg1); BigDecimal result5 = BigDecimal.Pow(lrg1, 2); BigDecimal result6 = BigDecimal.Exp(new BigInteger(5)); BigDecimal result7 = BigDecimal.Mod(mod1, mod2); BigDecimal result8 = BigDecimal.Negate(lrg1); BigDecimal result9 = BigDecimal.Floor(lrg1); BigDecimal result10 = BigDecimal.Ceiling(lrg1); BigDecimal result11 = BigDecimal.Abs(lrg1); actual1 = result1.ToString(); actual2 = result2.ToString(); actual3 = result3.ToString(); actual4 = result4.ToString(); actual5 = result5.ToString(); actual6 = result6.ToString(); actual7 = result7.ToString(); actual8 = result8.ToString(); actual9 = result9.ToString(); actual10 = result10.ToString(); actual11 = result11.ToString(); } finally { BigDecimal.Precision = savePrecision; BigDecimal.AlwaysTruncate = false; } Assert.AreEqual(expected1, actual1, $"Test Truncate On All Arithmetic Operations - #1: "); Assert.AreEqual(expected2, actual2, $"Test Truncate On All Arithmetic Operations - #2: "); Assert.AreEqual(expected3, actual3, $"Test Truncate On All Arithmetic Operations - #3: "); Assert.AreEqual(expected4, actual4, $"Test Truncate On All Arithmetic Operations - #4: "); Assert.AreEqual(expected5, actual5, $"Test Truncate On All Arithmetic Operations - #5: "); StringAssert.StartsWith(expected6, actual6, $"Test Truncate On All Arithmetic Operations - #6: "); Assert.AreEqual(expected7, actual7, $"Test Truncate On All Arithmetic Operations - #7: "); Assert.AreEqual(expected8, actual8, $"Test Truncate On All Arithmetic Operations - #8: "); Assert.AreEqual(expected9, actual9, $"Test Truncate On All Arithmetic Operations - #9: "); Assert.AreEqual(expected10, actual10, $"Test Truncate On All Arithmetic Operations - #10: "); Assert.AreEqual(expected11, actual11, $"Test Truncate On All Arithmetic Operations - #11: "); Assert.AreEqual(5000, BigDecimal.Precision, "Restore Precision to 5000"); }
public void LnETest() { Assert.AreEqual(new BigDecimal("1."), BigDecimal.Exp(BigDecimal.Ln(1, 2), 2)); }
protected override void UpdateMinerTimer_Elapsed(object sender, ElapsedEventArgs e) { if (m_isGetMiningParameters) { return; } try { m_isGetMiningParameters = true; var miningParameters = GetMiningParameters(); if (miningParameters == null) { OnGetMiningParameterStatus(this, false); return; } CurrentChallenge = miningParameters.ChallengeByte32; if (m_lastParameters == null || miningParameters.Challenge.Value != m_lastParameters.Challenge.Value) { Program.Print(string.Format("[INFO] New challenge detected {0}...", miningParameters.ChallengeByte32String)); OnNewChallenge(this, miningParameters.ChallengeByte32, MinerAddress); if (m_challengeReceiveDateTime == DateTime.MinValue) { m_challengeReceiveDateTime = DateTime.Now; } } if (m_lastParameters == null || miningParameters.MiningTarget.Value != m_lastParameters.MiningTarget.Value) { Program.Print(string.Format("[INFO] New target detected {0}...", miningParameters.MiningTargetByte32String)); OnNewTarget(this, miningParameters.MiningTarget); } if (m_lastParameters == null || miningParameters.MiningDifficulty.Value != m_lastParameters.MiningDifficulty.Value) { Program.Print(string.Format("[INFO] New difficulity detected ({0})...", miningParameters.MiningDifficulty.Value)); OnNewDifficulty?.Invoke(this, miningParameters.MiningDifficulty); Difficulty = miningParameters.MiningDifficulty; // Actual difficulty should have decimals var calculatedDifficulty = BigDecimal.Exp(BigInteger.Log(MaxTarget.Value) - BigInteger.Log(miningParameters.MiningTarget.Value)); var calculatedDifficultyBigInteger = BigInteger.Parse(calculatedDifficulty.ToString().Split(",.".ToCharArray())[0]); try // Perform rounding { if (uint.Parse(calculatedDifficulty.ToString().Split(",.".ToCharArray())[1].First().ToString()) >= 5) { calculatedDifficultyBigInteger++; } } catch { } if (Difficulty.Value != calculatedDifficultyBigInteger) { Difficulty = new HexBigInteger(calculatedDifficultyBigInteger); var expValue = BigInteger.Log10(calculatedDifficultyBigInteger); var calculatedTarget = BigInteger.Parse( (BigDecimal.Parse(MaxTarget.Value.ToString()) * BigDecimal.Pow(10, expValue) / (calculatedDifficulty * BigDecimal.Pow(10, expValue))). ToString().Split(",.".ToCharArray())[0]); var calculatedTargetHex = new HexBigInteger(calculatedTarget); Program.Print(string.Format("[INFO] Update target 0x{0}...", calculatedTarget.ToString("x64"))); OnNewTarget(this, calculatedTargetHex); CurrentTarget = calculatedTargetHex; } } IsPause = miningParameters.IsPause; m_lastParameters = miningParameters; OnStopSolvingCurrentChallenge(this, stopSolving: miningParameters.IsPause); OnGetMiningParameterStatus(this, true); } catch (Exception ex) { HandleException(ex); } finally { m_isGetMiningParameters = false; } }