2014-09-09 13 views
5

Trong khi viết chương trình, tôi tìm thấy khối gốc của một số trong một trong các hàm của tôi.Tìm khối gốc của một số Sử dụng phương thức System.Math.Pow() trong C#

khi tôi sử dụng mã bên dưới, tôi đã nhận được giá trị không đúng cho gốc khối lập phương (1 đã được in cho n = 64).

public static void cubicPairs(double n) 
{ 
    double root = (System.Math.Pow(n, (1/3))); 
    Console.WriteLine(root); 
} 

Bây giờ sau khi tôi đã thay đổi mã nhẹ này,

public static void cubicPairs(double n) 
{ 
    double root = (System.Math.Pow(n, (1.0/3.0))); //Changed how second parameter is passed 
    Console.WriteLine(root); 
} 

tôi đã root = 3.9999999999999996 (trong khi gỡ lỗi) nhưng phương pháp này đã được in 4 (đó là chính xác).

Tại sao có sự khác biệt giữa hai giá trị và nếu điều này có liên quan đến tham số thứ hai theo phương pháp System.Math.Pow() (ví dụ: 1.0/3.0 là giá trị đệ quy), tôi nên sử dụng cái gì để tìm căn bậc ba 4 (trong khi gỡ lỗi) thay vì 3.9999999999999996?

+3

Tôi nghĩ rằng trong trường hợp đầu tiên là kết quả của 1/3 là một int, vì vậy bạn đã kết thúc làm n^0 – isalgueiro

+0

@isalgueiro nhưng các tham số có phải là một giá trị gấp đôi và không phải là một int . Nếu nó đã được chuyển đổi sang int, không nên tôi nhận được bất kỳ lỗi hoặc một cái gì đó? – gkb

+3

@gopal Không vì 'int' được chuyển đổi hoàn toàn thành' double'. –

Trả lời

11

Đây là một bẫy tiêu chuẩn trong {ngôn ngữ dấu ngoặc nhọn}, C# được bao gồm, một bộ phận có toán hạng tích phân được thực hiện dưới dạng phân chia số nguyên, không phải là phân chia dấu phẩy động. Nó luôn mang lại một kết quả số nguyên, 1/3 tạo ra 0. Tăng bất kỳ số nào lên sức mạnh của 0 tạo ra 1.0

Bạn buộc phân chia dấu phẩy động bằng cách chuyển đổi một toán hạng thành gấp đôi. Giống như 1.0/3 hoặc (double)integerVariable/3.

Vấn đề tương tự với phép nhân, nhưng thường ít hơn của một cái bẫy, toán hạng tích phân tạo ra một kết quả không thể thiếu là rủi ro tràn. Điều này nếu không phản ánh cách thức hoạt động của bộ vi xử lý, nó có hướng dẫn riêng biệt cho các hoạt động này, IMUL so với FMUL và IDIV so với FDIV. Cái thứ hai khá nổi tiếng với một lỗi trong bộ xử lý Pentium :)

0

Lỗi (theo cách này, chỉ là 4E-16 - 400 quintillionths) là do lỗi dấu phẩy động.

Bạn có thể phá vỡ điều này bằng cách làm tròn số nếu nó nằm trong một ngưỡng nhất định:

public static void cubicPairs(double n) 
{ 
    double root = (System.Math.Pow(n, (1/3))); 
    double roundedRoot = Math.Round(root); 

    if (Math.Abs(roundedRoot - root) < VERY_SMALL_NUMBER) 
     return roundedRoot; 
    else 
     return root; 
} 

đâu VERY_SMALL_NUMBER có thể, nói, 1e-10.

+0

double root = (System.Math.Pow (n, (1.0/3.0))); cho kết quả tốt hơn bằng cách xử lý kết quả của 1/3 dưới dạng dấu phẩy động. –

1

Bạn có thể thử chạy mã này cho chức năng gốc khối lập phương.

textBox2.Text = Math.Pow(Convert.ToDouble(textBox1.Text), 0.3333333333333333).ToString(); 
0
public static void Main() 
{ 
    int a= int.Parse(Console.ReadLine()); 
    int sum=0; 

    for(int i=0 ; i<= a ;i++) 
    { 
     for(int j=0 ; j<i ;j++) 
     { 
      sum =+ (i*i); 
     } 
     Console.WriteLine("Number is : {0} and cube of the {0} is :{1} \n",i,sum*i); 
    } 
} 
Các vấn đề liên quan