khác hơn không, giá trị chính xác gấp đôi mà đến gần nhất với một bội chính xác của π/2 là 6381956970095103 * 2^797 , tương đương với:
(an odd integer) * π/2 + 2.983942503748063...e−19
Như vậy, đối với tất cả các giá trị tăng gấp đôi độ chính xác x, chúng tôi có các ràng buộc:
|cos(x)| >= cos(2.983942503748063...e−19)
Lưu ý rằng đây là một ràng buộc về giá trị chính xác toán học, không phải trên giá trị trả về bởi hàm thư viện cos
. Trên một nền tảng với một thư viện toán học chất lượng tốt, ràng buộc này là đủ tốt mà chúng ta có thể nói rằng cos(x)
không phải là số không cho bất kỳ chính xác đôi x
. Trong thực tế, nó chỉ ra rằng điều này không phải là duy nhất để tăng gấp đôi; thuộc tính này giữ cho tất cả các loại cơ bản IEEE-754, nếu cos
được làm tròn thành thật.
Tuy nhiên, đó không phải là để nói rằng điều này không bao giờ có thể xảy ra trên một nền tảng đã thực hiện một cách ngoạn mục nghèo giảm đối số lượng giác.
Thậm chí quan trọng hơn, đó là quan trọng cần lưu ý rằng trong ví dụ của bạn y
có thể vô hạn mà khôngcos(a)
là zero:
#include <math.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
double a = 0x1.6ac5b262ca1ffp+849;
double h = 0x1.0p1022;
printf("cos(a) = %g\n", cos(a));
printf("h/cos(a) = %g\n", h/cos(a));
return 0;
}
biên dịch và chạy:
scanon$ clang example.c && ./a.out
cos(a) = -4.68717e-19
h/cos(a) = -inf
Nguồn
2011-07-31 21:03:20
Đôi khi hệ thống có thể buộc nó không khi 'a' là aprox. bằng 'pi/2'. – ja72