如果实数可以用double精确表示,我怎么能写一个C++函数返回true?
bool isRepresentable( const char* realNumber ) { bool answer = false; // what goes here? return answer; }
简单测试:
assert( true==isRepresentable( "0.5" ) ); assert( false==isRepresentable( "0.1" ) );
Mike G... 5
圣洁的功课,蝙蝠侠!:)
让这个有趣的是你不能简单地做一个(atof | strtod | sscanf) - > sprintf循环并检查你是否得到了原始字符串.例如,许多平台上的sprintf检测到"尽可能接近0.1"并将其打印为0.1,即使0.1不能精确表示.
#includeint main() { printf("%llx = %f\n",0.1,0.1); }
打印:3fb999999999999a = 0.100000
在我的系统上.
真正的答案可能需要解析出double以将其转换为精确的小数表示(0.1 = 1/10),然后确保分母的atof转换时间等于分子.
我认为.
圣洁的功课,蝙蝠侠!:)
让这个有趣的是你不能简单地做一个(atof | strtod | sscanf) - > sprintf循环并检查你是否得到了原始字符串.例如,许多平台上的sprintf检测到"尽可能接近0.1"并将其打印为0.1,即使0.1不能精确表示.
#includeint main() { printf("%llx = %f\n",0.1,0.1); }
打印:3fb999999999999a = 0.100000
在我的系统上.
真正的答案可能需要解析出double以将其转换为精确的小数表示(0.1 = 1/10),然后确保分母的atof转换时间等于分子.
我认为.
将数字解析为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