浮点-如果一个实数可以用双精度表示,我如何编写一个返回true的C++函数
floating point - How can I write a C++ function returning true if a real number is exactly representable with a double?
如果实数可以用双精度表示,我如何编写一个返回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" ) );
将数字解析为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
神圣的作业,蝙蝠侠!:)
有趣的是,您不能简单地执行(atof|strtod|sscanf)->sprintf循环,然后检查是否返回了原始字符串。例如,在许多平台上,sprintf检测到"尽可能接近0.1"的双精度,并将其打印为0.1,即使0.1不能精确表示。
#include <stdio.h>
int main() {
printf("%llx = %fn",0.1,0.1);
}
打印:3fb999999999999a=0.100000
在我的系统上。
真正的答案可能需要解析出二重,将其转换为精确的分数表示(0.1=1/10),然后确保atof转换乘以分母等于分子。
我想。
这是我的版本。sprintf将0.5转换为0.50000,必须删除末尾的零。
EDIT:必须重写才能正确处理以0结尾的无小数点数字(如12300)。
bool isRepresentable(const char*realNumber){bool answer=false;double dVar=atof(实数);字符检查[20];sprintf(check,"%f",dVar);//删除末尾的零-TODO:仅当字符串中有小数点时执行for(int i=strlen(check)-1;i>=0;i-){if(check[i]!='0')break;check[i]=0;}answer=(strcmp(realNumber,check)==0);返回答案;}
这应该可以做到:
bool isRepresentable(const char *realNumber)
{
double value = strtod(realNumber, NULL);
char test[20];
sprintf(test, "%f", value);
return strcmp(realNumber, test) == 0;
}
可能最好使用"安全"版本的sprintf来防止潜在的缓冲区溢出(在这种情况下可能吗?)
我会将字符串转换为其数字位表示形式(位数组或长),然后将字符串转换成双精度,看看它们是否匹配。
将字符串转换为范围大于双精度的浮点值。把它变成一个替身,看看它们是否匹配。
相关文章:
- c++多进程编写一个唯一的文件
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 3-3. 编写一个程序来计算每个不同单词在其输入中出现的次数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 如何编写一个完美的缩写函数模板?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 编写一个不断要求用户输入的程序
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 编写一个代码,使年利率翻倍
- 如何将我编写的对象传递到另一个类的构造函数中?
- 使用一个用C++编写的库
- 如果我为一个类编写new和delete运算符,我是否必须编写它们的所有重载
- 哪一个是编写此 GL 代码的正确方法
- 如何在命令窗口的一个位置编写变量并在同一位置更新其值
- 将一个用 C 编写的程序与另一个用 C++ 编写的程序集成
- 编写一个程序来运行另一个已编写的程序
- 分析一个用c++编写的OpenGL 2.0游戏,入门项目是c#,所有这些都是在visual studio 2010中完成
- 一个用c++编写的简单游戏循环程序