Có thể đặt biến tham số với NaN không? và có điều đó trong một mô-đun cụ thể. Tôi muốn sử dụng nó để khởi tạo một số biến khác. Vì vậy, tôi sẽ phải đối mặt với một lỗi thời gian chạy, nếu chúng không được cập nhật, thay vì mô phỏng chạy với một số số ngẫu nhiên. Tôi đang sử dụng GFORTRAN.Có biến tham số (hằng số) với giá trị NaN trong FORTRAN
Trả lời
Có thể. Trước tiên, bạn phải tìm ra mẫu bit nào đại diện cho một trong các giá trị NaN có thể có. Bạn có thể lưu trữ các mẫu bit trong một số nguyên:
use, intrinsic :: iso_fortran_env
real(real64) x
integer(int64) i
x = 0
x = 0/x
print *, x
print *, transfer(x, i)
end
Nó cung cấp cho: -2251799813685248
Sau đó, bạn có thể khởi tạo các biến của bạn sử dụng
real(real64), parameter :: nan64 = transfer(-2251799813685248_int64, 1._real64)
Tương tự như vậy đối với 32 biến chút bạn sẽ có được số nguyên - 4194304, để bạn có thể làm
real(real32), parameter :: nan32 = transfer(-4194304_int32, 1._real32)
Nhiều trình biên dịch có tùy chọn để làm điều đó cho bạn cho tất cả các biến thực. Như francescalus cho thấy, trong gfortran nó là -finit-real=nan
. Làm điều đó bằng tay cho phép bạn kiểm soát tốt hơn.
Tuyên bố từ chối trách nhiệm: Cẩn thận khi chuyển sang nền tảng khác. Endianness và các vấn đề khác có thể đóng một vai trò, mặc dù tôi nghĩ rằng nó có thể được thực sự OK. Tôi giả định một CPU tuân thủ IEEE.
Xem, câu trả lời của câu trả lời cho một giải pháp thay thế sử dụng chức năng chuẩn. Thật không may, nó không áp dụng cho các hằng số parameter
, nhưng rất hữu ích.
Tôi đồng ý với đề xuất của bạn @Vladimir F theo cách này trong thời gian chạy, có thể thay đổi giá trị của biến thành NaN hoặc ngược lại. Nhưng nhược điểm là mẫu bit phụ thuộc vào máy của NaN. – Sorush
Để thêm vào Vladimir F's answer Tôi sẽ đề cập đến rằng gfortran 5.0 (nhưng không sớm hơn) hỗ trợ các mô-đun nội tại IEEE.
Thay vì
real x
x=0
x=0/x
người ta có thể sử dụng
use, intrinsic :: iso_fortran_env
use, intrinsic :: ieee_arithmetic
integer(int32) i
real(real32) x
x = ieee_value(x, ieee_quiet_nan)
i = transfer(x,i)
này cung cấp cho bạn một sự linh hoạt ít hơn mà của NaN giá trị bạn nhận được. Bạn cũng không cần phải lo lắng về bất kỳ cờ báo hiệu không hợp lệ nào. [Nhưng lưu ý rằng yêu cầu ieee_signaling_nan
có thể không thực sự cung cấp cho bạn điều đó.]
Lưu ý rằng không thể sử dụng trực tiếp ieee_value()
khi tham chiếu: tham chiếu đến nó không phải là cụm từ không đổi. Để sử dụng như vậy, hãy sử dụng phương pháp này để lấy mẫu bit và áp dụng phương thức của câu trả lời khác.
Bạn cũng sẽ cần đảm bảo rằng có hỗ trợ cho các tính năng cho từng loại dữ liệu.
Đúng, tôi vẫn không đi quá nhiều vào điều này, vì tôi phải giữ khả năng tương thích với gfortran 4.8. Thật không may, 'ieee_value' thực sự không được cho phép trong các biểu thức liên tục, vì vậy vẫn cần sử dụng phương thức transfer(). Thảo luận nhiều hơn là trong https://groups.google.com/forum/#!msg/comp.lang.fortran/tYC3UgAyNrY/6TzOLbkP6tsJ –
Có vẻ như nếu tôi muốn sử dụng NaN để gỡ lỗi và nhận được lỗi thời gian chạy, tôi có để sử dụng tín hiệu NaN chứ không phải là tín hiệu yên tĩnh ([Ref] (http://stackoverflow.com/questions/18118408/what-is-difference-between-quiet-nan-and-signaling-nan)). – Sorush
@Sorush Có. Không có gì đảm bảo rằng 'ieee_signaling_nan' sẽ dẫn đến một điều như vậy (mặc dù nó được khuyến nghị). Tôi không biết những gì gfortran trả về - nếu bạn có thể kiểm tra, hãy cho tôi biết. Một NaN yên tĩnh vẫn có giá trị, theo một nghĩa nào đó: bạn biết có gì đó không ổn. Không thuận tiện cho việc gỡ lỗi. – francescalus
Nếu bạn đang mắc kẹt với GFortran không có bản chất IEEE nhưng có iso_c_binding nội tại (như cái cần thiết để xây dựng R trên Windows), các công trình sau và tương đương với C và R NaN is.nan
vào R):
real(kind = c_double), parameter :: ONE = 1_c_double
real(kind = c_double), parameter :: NAN = TRANSFER(z'7FF0000000000001', ONE)
Điều thú vị là real(kind = c_double), parameter :: NAN = TRANSFER(z'7FF0000000000001', 1_c_double)
không kiểm tra của tôi cho is.nan
.
Bạn có biết rằng '1_c_double' là một số nguyên không? Sau khi nhận ra rằng bạn sẽ không tìm thấy thất bại mà thú vị hơn nữa. Dòng đầu tiên của bạn có thể chỉ là 'thực (loại = c_double), tham số :: ONE = 1' và nó sẽ thực hiện tương tự. Xem câu trả lời của tôi cho cú pháp thích hợp cho thực tế. –
Vì vậy, cuối cùng bạn chỉ có thể rút ngắn nó thành 'thực (c_double), tham số :: NAN = TRANSFER (z'7FF0000000000001 ', 1._c_double)' hoặc 'thực (c_double), tham số :: NAN = TRANSFER (9218868437227405313_c_int64_t, 1._c_double) ' –
@VladimirF, Cảm ơn bạn. – Avraham
- 1. Stored Procedure giá trị tham số mặc định - là này một hằng số hoặc một biến
- 2. giá trị hằng số trong Rails
- 3. params Tham số với giá trị tham số mặc định
- 4. Toán tử điều kiện có giá trị hằng số (đúng)?
- 5. PHP: Mảng các giá trị tham số chức năng biến
- 6. PHP: hằng số là biến trong hàm
- 7. JSON có giá trị hàm với tham số
- 8. Tiêm các giá trị cho hằng số tĩnh trong Spring
- 9. SQL - bất kỳ khác biệt hiệu suất nào sử dụng các giá trị hằng số so với các tham số?
- 10. Xác minh giá trị tham số tham chiếu với Moq
- 11. Truyền tham số biến đổi thuật toán std theo giá trị so với tham chiếu
- 12. Hằng số hoặc biến lớp trong ruby?
- 13. Có hằng số xác định giá trị cực đại của số nguyên dài hay không?
- 14. hằng số chữ so với biến trong thư viện toán
- 15. Tham số tùy chọn Giá trị Bảng
- 16. Sử dụng biến lớp làm hằng số trong Scala
- 17. Lưu trữ các giá trị số nguyên như hằng số theo cách Enum trong java
- 18. Constructor với từng giá trị tham số & noexcept
- 19. Giá trị tham số IProcessHostPreloadClient ở đâu?
- 20. Hằng số động trong PHP?
- 21. C#, giá trị tham số mặc định cho IntPtr
- 22. DSL với Groovy -> chuyển giá trị tham số
- 23. Sử dụng cfqueryparam với các hằng số
- 24. Có thể khai báo giá trị hằng số tĩnh ảo trong lớp C++ không?
- 25. tham số lambda với giá trị trả về tùy chọn
- 26. System.Data.SQLite truy vấn tham số hóa với nhiều giá trị?
- 27. Lớp với các giá trị hằng số tĩnh được xác định trong Mục tiêu-C
- 28. Cách kiểm tra xem giá trị có được chọn trong tham số nhiều giá trị
- 29. Swagger: có thể thực hiện hằng số tham số hoạt động/chỉ đọc không?
- 30. Truyền thuộc tính tùy chỉnh với giá trị biến là tham số
Đối với gfortran, tôi sẽ bị cám dỗ chỉ xem xét '-finit-real = nan'. – francescalus