当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如果实数可以用double精确表示,我怎么能写一个C++函数返回true?》经验,为你挑选了2个好方法。

如果实数可以用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不能精确表示.

#include 

int main() {
    printf("%llx = %f\n",0.1,0.1);
}

打印:3fb999999999999a = 0.100000

在我的系统上.

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

我认为.



1> Mike G...:

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

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

#include 

int main() {
    printf("%llx = %f\n",0.1,0.1);
}

打印:3fb999999999999a = 0.100000

在我的系统上.

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

我认为.



2> Alexei..:

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

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有