提问人: 提问时间:8/2/2022 更新时间:8/2/2022 访问量:443
C++ - 如何计算双/浮点数中点后的数字长度?
C++ - How to count the length of the digits after the dot in a double / float?
问:
如何计算双精度/浮点数中点后的数字长度?
没有。std::string
所以点之后的长度是 .1234.5678
4
在这种情况下,您应该如何正确使用 epsilon?
我有这样的东西,一个版本有 epsilon,另一个没有,两者都不能完全工作。
// Version 1.
template <typename T> inline constexpr
unsigned int get_length(T x, const bool& include_dot = false) {
unsigned int len = 0;
x = abs(x);
auto c = x - floor(x);
T factor = 10;
T eps = epsilon() * c;
while (c > eps && c < 1 - eps) {
c = x * factor;
c = c - floor(c);
factor *= 10;
eps = epsilon() * x * factor;
++len;
}
if (include_dot && len > 0) { ++len; }
return len;
}
// Version 2.
template <typename T> inline constexpr
unsigned int get_length(const T& x, const bool& include_dot = false, const unsigned int& max_consequtive_zeros = 6) {
unsigned int len = 0;
unsigned int zero_count = 0;
short digit;
auto decimals = get_decimals(x);
while (decimals != 0 && len < 14) {
decimals *= 10;
digit = decimals;
if (digit == 0) {
if (zero_count >= max_consequtive_zeros) { break; }
++zero_count;
}
else { zero_count = 0; }
decimals -= digit;
++len;
// std::cout << len << ": " << decimals << " zeros: " << zero_count << "\n";
}
if (include_dot && len > 0) { ++len; }
return len - zero_count;
}
答:
3赞
Jeffrey
8/2/2022
#1
浮点数不以十进制格式存储值。它以二进制形式存储它。
例如,如果尝试存储在浮点数中,则实际可以存储的最接近的值为:234.56
234.55999755859375
1234.5678
是1234.5677490234375
(去和 https://www.h-schmidt.net/FloatConverter/IEEE754.html 一起玩,亲眼看看)
因此,浮点数中数字的长度(以十进制数字表示)定义不明确。为了保持理智,请根据大小而不是位数来定义 epsilon。
评论
1234.5678
4
double
DBL_MIN
1234.5678
double
double
1234.5678
点后的长度为4
不。事实并非如此。事实并非如此,因为在二进制浮点数中,没有1234.5678
这样的数字。一开始很难考虑,但在你理解它之前,计算机浮点将仍然令人沮丧和困难。你和我使用十进制数字,如 1234.5678。但你的二进制计算机没有。