如何测试指定浮点数在c ++中有多少有效数字?如果我写的话说:
sigfigs(x);
x是浮点数的值, 它会将整数值设置为y,即sigfigs的数量
如何以这种方式编写void函数
这已经困扰了我一段时间,任何答案都赞赏
btw mysticial这是要求一个代码来查找浮动中的sig figs的数量,而不是有多少像你链接到的那个作为副本-.-
答案 0 :(得分:0)
这有点棘手,因为您应该已经知道,浮点数通常不准确,而是数字的近似值。例如,10.1
最终为10.09999...
。 double有大约15位精度,因此15是你的sigfigs()
函数可以合理返回的最大值。并且它需要为double和float重载,因为当然float只有一半的精度数字:
int sigfigs(double x); // returns 1 to 15
int sigfigs(float x); // returns 1 to 7
现在可能有更聪明的数学方法可以做到这一点,但有一个想法是:
int sigfigs(double x) {
int mag = log10(fabs(x));
double div = pow(10, mag);
char str[20];
int wrote = snprintf(str, sizeof(str), "%.15g", x/div);
return std::count_if(str, str + wrote, isdigit);
}
这肯定缺少一些情况,但我认为抓住了这个想法:我们首先规范化大/小数字,以便最终得到接近1的东西,然后我们用合适的格式字符串打印它以允许最大可用精度要显示,然后我们计算有多少位数。
在0
,10
等处存在显着的边界条件错误,这些错误留作练习来纠正。偶然地,NAN产生0,这是好的; +/-无穷大也产生0。
最后一点说明;这并不严格符合重要数字的通常定义。特别是,不考虑小数位后的尾随零,因为只有double
或float
才能执行此操作。例如,10
和10.00000
的文字输入会从atof()
生成按位相同的结果。因此,如果您需要一个符合sigfigs学术定义的完整解决方案,您将需要实现一个包含例如sigfigs的用户定义类型。 sigfigs的double和int。然后,您可以按照通常的规则实施所有算术运算符,以便在整个计算过程中携带sigfigs。
答案 1 :(得分:0)
您是否尝试确定浮点数中的精度位数或变量中significant figures的数量? C和C ++通常不指定用于float
和double
的格式,但如果您知道存储和处理该数字的浮点格式,则可以确定精确。目前大多数硬件使用IEEE 754格式。查看定义将是一个很好的起点。
有效数字是一个完全不同的问题。有效数字的定义包括有多少数字实际有意义的概念,而不是由于浮点表示而提供的数字数量。例如,如果使用12位A / D转换器采样电压(并且模拟设计足够好以致所有位都很重要),那么您读取的数据将具有12个有效位,并将其存储为具有更高位的格式精度不会增加有效数字的数量。例如,您将其存储为16位整数或32位IEEE 754浮点数,具体取决于您计划对数据执行的操作。在任何一种情况下,即使32位浮点数具有24位尾数,您仍然只有12个有效位。
如果有重要的数字和浮点运算,Goldberg的What Every Computer Scientist Should Now About Floating-Point Arithmetic可以完全涵盖这个问题。