2011-11-13 42 views
5

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?

Trả lời

7

Đố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 
1

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.

+0

Điều đó sẽ tái phát minh bánh xe. – Dykam

+0

@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ó. –

+0

Đó 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

6

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.

+0

Liên kết bignum đó bị hỏng. –

+0

@GeorgeDuckett - Vậy là xong. Bạn có liên kết đến một trang web đang hoạt động không? – Oded

+0

Tôi không, xin lỗi. –

Các vấn đề liên quan