如果实数可以用double精确表示,我怎么能写一个C++函数返回true?

Ale*_*son 5 c++ floating-point

如果实数可以用double精确表示,我怎么能写一个C++函数返回true?

bool isRepresentable( const char* realNumber )
{
   bool answer = false;
   // what goes here?
   return answer;
}
Run Code Online (Sandbox Code Playgroud)

简单测试:

assert( true==isRepresentable( "0.5" ) );
assert( false==isRepresentable( "0.1" ) );
Run Code Online (Sandbox Code Playgroud)

Mik*_* G. 5

圣洁的功课,蝙蝠侠!:)

让这个有趣的是你不能简单地做一个(atof | strtod | sscanf) - > sprintf循环并检查你是否得到了原始字符串.例如,许多平台上的sprintf检测到"尽可能接近0.1"并将其打印为0.1,即使0.1不能精确表示.

#include <stdio.h>

int main() {
    printf("%llx = %f\n",0.1,0.1);
}
Run Code Online (Sandbox Code Playgroud)

打印:3fb999999999999a = 0.100000

在我的系统上.

真正的答案可能需要解析出double以将其转换为精确的小数表示(0.1 = 1/10),然后确保分母的atof转换时间等于分子.

我认为.


Ale*_*xei 5

将数字解析为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