如何测试浮点数在C ++中有多少有效数字?

时间:2014-09-06 00:49:30

标签: c++

如何测试指定浮点数在c ++中有多少有效数字?如果我写的话说:

sigfigs(x);

x是浮点数的值, 它会将整数值设置为y,即sigfigs的数量

如何以这种方式编写void函数

这已经困扰了我一段时间,任何答案都赞赏

btw mysticial这是要求一个代码来查找浮动中的sig figs的数量,而不是有多少像你链接到的那个作为副本-.-

2 个答案:

答案 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的东西,然后我们用合适的格式字符串打印它以允许最大可用精度要显示,然后我们计算有多少位数。

010等处存在显着的边界条件错误,这些错误留作练习来纠正。偶然地,NAN产生0,这是好的; +/-无穷大也产生0。

最后一点说明;这并不严格符合重要数字的通常定义。特别是,不考虑小数位后的尾随零,因为只有doublefloat才能执行此操作。例如,1010.00000的文字输入会从atof()生成按位相同的结果。因此,如果您需要一个符合sigfigs学术定义的完整解决方案,您将需要实现一个包含例如sigfigs的用户定义类型。 sigfigs的double和int。然后,您可以按照通常的规则实施所有算术运算符,以便在整个计算过程中携带sigfigs。

答案 1 :(得分:0)

您是否尝试确定浮点数中的精度位数或变量中significant figures的数量? C和C ++通常不指定用于floatdouble的格式,但如果您知道存储和处理该数字的浮点格式,则可以确定精确。目前大多数硬件使用IEEE 754格式。查看定义将是一个很好的起点。

有效数字是一个完全不同的问题。有效数字的定义包括有多少数字实际有意义的概念,而不是由于浮点表示而提供的数字数量。例如,如果使用12位A / D转换器采样电压(并且模拟设计足够好以致所有位都很重要),那么您读取的数据将具有12个有效位,并将其存储为具有更高位的格式精度不会增加有效数字的数量。例如,您将其存储为16位整数或32位IEEE 754浮点数,具体取决于您计划对数据执行的操作。在任何一种情况下,即使32位浮点数具有24位尾数,您仍然只有12个有效位。

如果有重要的数字和浮点运算,Goldberg的What Every Computer Scientist Should Now About Floating-Point Arithmetic可以完全涵盖这个问题。