如果一个实数可以精确地用双精度表示,我怎么写一个返回true的C++函数呢?
bool isRepresentable( const char* realNumber )
{
bool answer = false;
// what goes here?
return answer;
}简单的测试:
assert( true==isRepresentable( "0.5" ) );
assert( false==isRepresentable( "0.1" ) );发布于 2008-11-04 18:18:53
将数字解析为a+N/ (10^k)的形式,其中a和N是整数,k是小数位数。
示例: 12.0345 -> 12 + 345 / 10^4,a= 12,N= 345,k=4
现在,10^k = (2 * 5) ^k= 2^k * 5^k
当且仅当您去掉分母中的5^k项时,您才能将您的数字表示为精确的二进制分数。
结果将检查(N mod 5^k) == 0
发布于 2008-11-04 16:17:42
天哪,蝙蝠侠!:)
有趣的是,您不能简单地执行(atof|strtod|sscanf) -> sprintf循环并检查是否得到了原始字符串。例如,在许多平台上,sprintf会检测到“尽可能接近0.1”,并将其打印为0.1,即使0.1不能精确表示。
#include <stdio.h>
int main() {
printf("%llx = %f\n",0.1,0.1);
}打印: 3fb999999999999a = 0.100000
在我的系统上。
真正的答案可能需要解析出双精度数以将其转换为精确的小数表示(0.1 = 1/10),然后确保atof转换乘以分母等于分子。
我认为。
发布于 2008-11-04 16:02:52
这应该能起到作用:
bool isRepresentable(const char *realNumber)
{
double value = strtod(realNumber, NULL);
char test[20];
sprintf(test, "%f", value);
return strcmp(realNumber, test) == 0;
}也许最好使用“安全”版本的sprintf来防止潜在的缓冲区溢出(在这种情况下可能吗?)
https://stackoverflow.com/questions/262201
复制相似问题