- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tôi thực sự bối rối. Tôi đang cố gắng tính các số Fibonacci, nhưng khi chúng ngày càng lớn hơn, các con số bắt đầu có vẻ sai. Tôi không biết tại sao.
Làm cách nào tôi có thể tính toán các số Fibonacci chính xác bằng công thức Binet, theo hiểu biết của tôi, công thức này luôn trả về một số nguyên?
Đây là thứ tôi đã cố gắng sử dụng.
Hãy xem những con số đang tăng lên. Trở nên kỳ lạ?
Ở đây tôi sử dụng cout.precision(15); để in ra
Ở đây tôi sử dụng cout << fix << blah blah; để in ra;
Ở đây tôi đang sử dụng vòng lặp chương trình để tính toán bằng cách lặp qua nó.
Điều này chính xác hơn việc sử dụng công thức Binet.
Dẫu sao thì. Có ai có bất kỳ mã nào tôi có thể xem để tính F(n) mà không cần sử dụng công thức Binet để lặp qua từng cấp độ của (n) không?
câu trả lời hay nhất
Để tính toán chính xác các số Fibonacci bằng công thức Binet, bạn cần diễn giải chính xác √5. Vì √5 là số vô tỉ nên không dùng đượcgấp đôi
để diễn đạt một cách chính xác. hoặc float
, do đó công thức Binet không áp dụng được cho những loại này (tuy nhiên, việc làm tròn trong phép tính có thể dẫn đến kết quả chính xác cho một số đầu vào nhỏ). Vì số Fibonacci là số nguyên nên bạn có thể sử dụng gấp đôi
Nhận kết quả chính xác từ công thức Binet. hoặc float
Nhận thêm thông số bằng cách làm tròn,
binet kép(unsigned int n)
{
const tĩnh double phi = (1 + sqrt(5))*0.5;
fib đôi = (pow(phi,n) - pow(1-phi,n))/sqrt(5);
vòng quay trở lại(fib);
}
Điều này sẽ có tác dụng với hầu hết tất cả n
trả về kết quả đúng đủ nhỏ để kết quả có thể được biểu thị chính xác như gấp đôi
.Tuy nhiên, số lượng này không nhiều. gấp đôi
Thông thường chỉ có độ chính xác 53 bit, do đó chỉ có ít hơn 253 Số Fibonacci có thể được biểu diễn chính xác như sau gấp đôi
(Cộng với một số cái lớn hơn có thể chia hết cho lũy thừa đủ cao là 2). Cái cuối cùng nhỏ hơn 253 Số Fibonacci là F(77), nhưng F(78) chia hết cho 8, do đó nó cũng có thể được biểu diễn chính xác như sau gấp đôi
Có độ chính xác 53 bit. Tuy nhiên, những điều trên chỉ áp dụng được cho n <= 70
tạo ra kết quả đúng ở đây, bắt đầu từ 71, sai số làm tròn quá lớn (BTW, công thức Binet sử dụng đôi
Kết quả của ở đây luôn quá lớn nên hãy sử dụng sàn nhà
thay vì tròn
cũng sẽ là F(71), nhưng không xa hơn).
Không có nhiều số Fibonacci có thể được biểu diễn chính xác bằng cách sử dụng các kiểu dữ liệu tiêu chuẩn, số cuối cùng phù hợp với loại 64-bit (không dấu) là F(93); đối với 128-bit, số cuối cùng là F(186). Đối với một chỉ mục nhỏ như vậy, sẽ thu được rất ít lợi ích với thuật toán lặp đơn giản
fibonacci dài không dấu(unsigned int n)
{
dài không dấu dài a = 0, b = 1;
vì(; n > 0; --n)
{
b += a;
a = ba;
}
trả lại một;
}
Trừ khi bạn sử dụng bảng tra cứu
const tĩnh không dấu sợi dài dài [94] = { 0, 1, 1, 2, ... , 12200160415121876738ull };
Để có được kết quả chính xác, bạn phải coi √5 (và/hoặc φ) là hằng số ký hiệu và sử dụng nó để tính công thức. Điều này tương đương với công thức trong vòng đánh giá
ℤ[φ] = { a + b*φ : a, b ∈ ℤ }
ℚ(√5)
số nguyên đại số trong , sử dụng φ² = 1 + φ
Thực tế tương đương với công thức Binet là
φ^n = F(n-1) + φ*F(n)
Có thể được sử dụng để tính toán hiệu quả các số Fibonacci bằng cách lặp lại các bình phương trong các bước O(log n) (nhưng lưu ý rằng F(n) có Θ(n) bit, do đó số thao tác bit không thể nhỏ hơn O(n)). hơn Vanilla Square sử dụng phiên bản hiệu quả hơn một chút
φ^(2n) = (φ^n)² = (F(n-1) + φ*F(n))² = F(n-1)² + φ*2*F(n-1)*F (n) + φ 2*F(n) 2
= (F(n-1) 2 + F(n) 2) + φ*(2*F(n-1)*F(n) + F(n) 2)
Phát hiện F(2n) = 2*F(n)*F(n-1) + F(n)² = 2*F(n)*F(n+1) - F(n)² = F(n)* (F(n+1) + F(n-1))
Và F(2n+1) = F(n) 2 + F(n+1) 2
, sử dụng φ² = 1 + φ
.Các công thức này cho phép tính F(2n), F(2n+1) và F(2n+2) từ F(n) và F(n+1) với tối đa hai phép nhân và hai phép cộng/trừ cho mỗi số, trong đó đưa ra thuật toán tính toán các cặp (F(n),F(n+1))
Trong các bước O(log n), chỉ có hai số làm trạng thái (Hình vuông lặp lại Vanilla sử dụng bốn số làm trạng thái, yêu cầu nhiều phép nhân hơn).
Thuật toán lặp từ trái sang phải là
sợi dài dài không dấu(unsigned int n){
nếu (n == 0) trả về 0;
unsigned int h = n/2, mặt nạ = 1;
// tìm bit được đặt cao nhất trong n, có thể được thực hiện tốt hơn
while(mặt nạ <= h) mặt nạ <<= 1;
mặt nạ >>= 1;
dài không dấu dài a = 1, b = 1, c; // a = F(k), b = F(k+1), k = 1 ban đầu
trong khi(mặt nạ)
{
c = a*a+b*b; // F(2k+1)
nếu (n&mặt nạ)
{
b = b*(b+2*a); // F(2k+2)
a = c; // F(2k+1)
} khác {
a = a*(2*ba); // F(2k)
b = c; // F(2k+1)
}
mặt nạ >>= 1;
}
trả lại một;
}
Thay vào đó hãy sử dụng các loại chính xác tùy ý không dấu dài dài
, cho phép tính toán nhanh các số Fibonacci lớn. Nhưng tất nhiên, các thư viện có độ chính xác tùy ý thường đi kèm với các hàm Fibonacci được tối ưu hóa của riêng chúng, vì vậy việc tự triển khai nó sẽ hơi khó khăn.
Giới thiệu về c++ - Tính chính xác dãy Fibonacci trong C++? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/9645193/
Tôi cần đặt văn bản vào một Div, trong một Div khác, trong một Div khác. Vì vậy, nó trông như thế này: #document Thay đổi mã PIN
Những điều kỳ lạ đã xảy ra. Tôi có một mã html cơ bản. html, đầu, thân. (Vì tôi nhận được một số lượt phản đối nên đây là mã đầy đủ) Đây là CSS của tôi: html { backgroun
Tôi đang cố tải một tập hợp hình ảnh từ Nội dung vào ImageView có trong UICollectionview nhưng bất cứ khi nào tôi chạy ứng dụng thì nó đều báo lỗi. Và cũng không có hình ảnh nào được hiển thị. Tôi đang ở ViewDidLoa
Tôi cần thay đổi một số biến môi trường dựa trên đầu ra của tập lệnh Perl có tham số. Trong tcsh, tôi có thể sử dụng lệnh bí danh để đánh giá kết quả đầu ra của tập lệnh Perl. tcsh: bí danh setsdk 'eval `/localhome/
Tôi đã tạo một ứng dụng Blazor (phía máy chủ) mới bằng Xác thực Windows và chạy nó bằng IIS Express. Nó sẽ hiển thị thông báo "Xin chào miền\Người dùng!" từ Ra sau ở trên cùng bên phải!
Đây là phương thức void login(Event event) của tôi; Tôi muốn biết cách thực hiện nó trong Kotlin. Câu trả lời hay nhất Trong Kotlin, toán tử ký tự đại diện là *. Nó báo cho trình biên dịch rằng nó chưa được biết, nhưng một khi đã biết thì không có lớp nào khác
Hãy xem đoạn mã sau cho câu chuyện trong sách nếu story.title.length < 140 - var story
Tôi đang cố gắng học xử lý chuỗi trong C. Tôi đã viết một chương trình lưu trữ một số bản nhạc và giúp người dùng kiểm tra xem bài hát mà họ nghĩ đến có tồn tại trong các bản nhạc được lưu trữ hay không. Điều này được thực hiện bằng cách yêu cầu người dùng nhập một chuỗi ký tự. Chương trình sau đó sử dụng strstr()
Tôi đang học sscanf và gặp chuỗi định dạng sau: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); Phần ] có nghĩa là quét cho đến khi gặp ':' và gán nó cho a. :
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
Tôi gặp tình huống muốn đưa các dòng hiện có từ tệp văn bản vào một khối mới. dòng 1 dòng 2 dòng trong khối dòng 3 dòng 4 sẽ trở thành dòng 1 dòng 2 dòng
Tôi có một dự án mới và tôi đang cố gắng thiết lập thanh công cụ gỡ lỗi Django. Trước tiên, tôi đã thử thiết lập nhanh, việc này chỉ đơn giản là thêm 'debug_toolbar' vào danh sách các ứng dụng đã cài đặt của tôi. Với điều này, khi tôi truy cập URL gốc của mình, việc gỡ lỗi
Trong Matlab, nếu tôi có hàm f, giả sử chữ ký là f(a,b,c), tôi có thể tạo một hàm chỉ có một biến b, biến này sẽ gọi f với a=a1 và c=c1 cố định: g = @(b) f(a1, b,
Tôi không hiểu tại sao lại có thêm khoảng cách dọc giữa các phần tử trong ForEach khi hiển thị các dải phân cách ngang tùy chỉnh bên trong VStack khi sử dụng GeometryReader bên trong ScrollView. Cuộn
Tôi đang tự hỏi, có hướng dẫn hoặc phương pháp hay nhất nào về thời điểm sử dụng phiên và cookie không? Những gì nên và không nên lưu trữ trong đó? Cảm ơn bạn! Câu trả lời hay nhất Những tài liệu này cung cấp sự hiểu biết tốt về các vấn đề bảo mật cookie phiên và
Tôi có ma trận Nx3 ở dạng scipy/numpy và tôi muốn sử dụng nó để tạo biểu đồ thanh 3 chiều, trong đó trục X và Y được xác định bởi các giá trị của cột thứ nhất và thứ hai của ma trận và chiều cao của mỗi thanh ở cột thứ ba của ma trận, số lượng thanh được xác định bởi N.
Giả sử tôi khởi tạo semaphore theo hai cách khác nhau sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) Bây giờ, sem_wait(&randomsem) trong cả hai trường hợp
Tôi nghi ngờ cách giá trị được lưu trữ trong "WORD" vì PStr chứa đầu ra thực tế. ? Vì Pstr lưu trữ chữ thường thành chữ in hoa, làm sao nó có thể được đưa ra dưới dạng "WORD" trong printf. Có ai có thể vui lòng không? Giải thích? #bao gồm
Tôi có một mảng 3x3: var my_array = [[0,1,2], [3,4,5], [6,7,8]];
Tôi nhận ra rằng bạn có thể dễ dàng kiểm tra tiêu điểm bằng cách sử dụng: var hasFocus = true; $(window).blur(function(){ hasFocus = false; });
Tôi là một lập trình viên xuất sắc, rất giỏi!