首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果一个实数可以精确地用双精度表示,我怎么写一个返回true的C++函数呢?

问如果一个实数可以精确地用双精度表示,我怎么写一个返回true的C++函数呢?
EN

Stack Overflow用户
提问于 2008-11-04 15:50:48
回答 5查看 2.6K关注 0票数 5

如果一个实数可以精确地用双精度表示,我怎么写一个返回true的C++函数呢?

代码语言:javascript
复制
bool isRepresentable( const char* realNumber )
{
   bool answer = false;
   // what goes here?
   return answer;
}

简单的测试:

代码语言:javascript
复制
assert( true==isRepresentable( "0.5" ) );
assert( false==isRepresentable( "0.1" ) );
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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

票数 5
EN

Stack Overflow用户

发布于 2008-11-04 16:17:42

天哪,蝙蝠侠!:)

有趣的是,您不能简单地执行(atof|strtod|sscanf) -> sprintf循环并检查是否得到了原始字符串。例如,在许多平台上,sprintf会检测到“尽可能接近0.1”,并将其打印为0.1,即使0.1不能精确表示。

代码语言:javascript
复制
#include <stdio.h>

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

打印: 3fb999999999999a = 0.100000

在我的系统上。

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

我认为。

票数 5
EN

Stack Overflow用户

发布于 2008-11-04 16:02:52

这应该能起到作用:

代码语言:javascript
复制
bool isRepresentable(const char *realNumber)
{
    double value = strtod(realNumber, NULL);

    char test[20];
    sprintf(test, "%f", value);

    return strcmp(realNumber, test) == 0;
}

也许最好使用“安全”版本的sprintf来防止潜在的缓冲区溢出(在这种情况下可能吗?)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/262201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档