Đúp có phạm vi nhiều hơn số nguyên 64 bit, nhưng độ chính xác của nó thấp hơn giá trị biểu diễn của nó (vì đôi là 64 bit, nó có thể không phù hợp với giá trị thực tế hơn). Vì vậy, khi đại diện cho các số nguyên lớn hơn, bạn bắt đầu mất độ chính xác trong phần nguyên.Tìm số nguyên tối đa mà một loại dấu phẩy động có thể xử lý mà không mất độ chính xác
#include <boost/cstdint.hpp>
#include <limits>
template<typename T, typename TFloat>
void
maxint_to_double()
{
T i = std::numeric_limits<T>::max();
TFloat d = i;
std::cout
<< std::fixed
<< i << std::endl
<< d << std::endl;
}
int
main()
{
maxint_to_double<int, double>();
maxint_to_double<boost::intmax_t, double>();
maxint_to_double<int, float>();
return 0;
}
in này:
2147483647
2147483647.000000
9223372036854775807
9223372036854775800.000000
2147483647
2147483648.000000
Lưu ý cách tối đa int
có thể phù hợp với một double
mà không làm mất độ chính xác và boost::intmax_t
(64-bit trong trường hợp này) thì không thể. float
thậm chí không thể giữ int
.
Bây giờ, câu hỏi: có cách nào trong C++ để kiểm tra xem toàn bộ phạm vi của một loại số nguyên nhất định có thể vừa với loại điểm loanh mà không mất độ chính xác không?
Tốt,
- nó sẽ là một tấm séc thời gian biên dịch có thể được sử dụng trong một sự khẳng định tĩnh,
- và sẽ không liên quan đến liệt kê các hằng số trình biên dịch nên biết hoặc có thể tính toán.
Tại sao bạn phải kiểm tra? Phần nguyên có độ chính xác 52 bit, vì vậy đó là số tiền bạn nhận được. –
Khi bạn đã xác định giới hạn, bạn không thể chỉ định một CONST? –
@Billy: _Technically_ C++ không yêu cầu điểm nổi IEEE 754, vì vậy giả sử việc triển khai sử dụng IEEE 754 không phải là di động (thực tế là IEEE 754 có mặt khắp mọi nơi). –