xem xét mã này:C# độ chính xác cao tính toán
double result = Math.Sqrt(4746073226998689451);
Đối với kết quả tôi nhận được 2178548422 thay vì 2178548421.999999854etc ... Làm thế nào tôi có thể nhận được kết quả chính xác hơn?
xem xét mã này:C# độ chính xác cao tính toán
double result = Math.Sqrt(4746073226998689451);
Đối với kết quả tôi nhận được 2178548422 thay vì 2178548421.999999854etc ... Làm thế nào tôi có thể nhận được kết quả chính xác hơn?
Đối với các vấn đề cụ thể, tính toán căn bậc hai, bạn có thể sử dụng loại thập phân và thuật toán của Newton:
using System;
class Program
{
public static void Main()
{
long x = 4746073226998689451;
decimal sqrt_x = (decimal)Math.Sqrt(x);
for (int i = 0; i < 10; ++i)
sqrt_x = 0.5m * (sqrt_x + x/sqrt_x);
Console.WriteLine("{0:F16}", sqrt_x);
}
}
Kết quả là:
2178548421.9999998547197773
Sử dụng digit by digit calculation sẽ cung cấp cho bạn bao nhiêu chữ số như bạn đang tìm kiếm.
Có một loạt thư viện toán học có độ chính xác cao cho .NET được đề cập trên trang wikipedia - Arbitrary-percision artithmatic.
Tôi đã thấy BigNum được đề xuất ở đây trước đây, mặc dù liên kết wikipedia bị hỏng và tôi không thể tìm thấy thư viện ở nơi khác vào lúc này.
Tùy chọn khác trên trang là C# binding for MPIR.
Liên kết bignum đó bị hỏng. –
@GeorgeDuckett - Vậy là xong. Bạn có liên kết đến một trang web đang hoạt động không? – Oded
Tôi không, xin lỗi. –
thay vì đôi, hãy thử số nguyên lớn và cũng kiểm tra liên kết này
Điều đó sẽ tái phát minh bánh xe. – Dykam
@Dykam - Tại sao? Tôi không gợi ý anh ta nên tự viết mã thuật toán. Nếu có một thực hiện, bằng mọi cách, sử dụng nó. –
Đó là sự thật, nhưng có rất nhiều thuật toán để tính toán tùy ý, đây chỉ là một. Tôi nghĩ rằng sẽ hữu ích hơn khi liên kết đến triển khai. – Dykam