我在C语言中使用绝对值时遇到问题

我在C语言中使用绝对值时遇到问题,c,C,我在理解某些东西时遇到了问题 假设我有一个向量 double values[size]; 我想计算其中非零值的数量 int counter; if(abs(counter) > 0.000001) ++counter; 但是,这不会返回与相同的计数器值 if(counter > 0.0000001 || counter < -0.000001) if(计数器>0.0000001 | |计数器0;){if(value[--i]!=0.0)计数器+}为什么要检查计数器是

我在理解某些东西时遇到了问题

假设我有一个向量

double values[size];
我想计算其中非零值的数量

int counter;
if(abs(counter) > 0.000001)
   ++counter;
但是,这不会返回与相同的计数器值

if(counter > 0.0000001 || counter < -0.000001)
if(计数器>0.0000001 | |计数器<-0.000001)

您使用了错误的函数
abs()
返回一个整数值。您确实想使用
fabs()
函数。在代码中,由于整数截断,数字的小数部分完全丢失

其次,您可以将该值与0.0进行比较。在ANSI C中,根据C99,可以有正0.0和负0.0,但等效运算符检查(即:
=
)仍将报告它们相等/等效

最后,这里使用绝对值函数有点过分了。您真正需要使用它的唯一原因是,如果您想计算数组中的值是否“足够接近”为零

小案例-是零吗?

示例代码


非同寻常的情况-我们是否“足够接近”零?

示例代码-案例2


参考资料


  • Double
    fabs()
    ,访问日期2014-03-28
  • 生成随机双精度编号,访问日期2014-03-28
  • 截短,查阅日期2014-03-28

  • 你使用了错误的函数
    abs()
    返回一个整数值。您确实想使用
    fabs()
    函数。在代码中,由于整数截断,数字的小数部分完全丢失

    其次,您可以将该值与0.0进行比较。在ANSI C中,根据C99,可以有正0.0和负0.0,但等效运算符检查(即:
    =
    )仍将报告它们相等/等效

    最后,这里使用绝对值函数有点过分了。您真正需要使用它的唯一原因是,如果您想计算数组中的值是否“足够接近”为零

    小案例-是零吗?

    示例代码


    非同寻常的情况-我们是否“足够接近”零?

    示例代码-案例2


    参考资料


  • Double
    fabs()
    ,访问日期2014-03-28
  • 生成随机双精度编号,访问日期2014-03-28
  • 截短,查阅日期2014-03-28

  • 为什么要检查
    计数器
    是否为零,而不检查
    值[i]
    [0,size)
    中的
    i
    位置?建议不要使用
    abs()
    size\t计数器=0;对于(size\t i=size;i>0;){if(value[--i]!=0.0)计数器+}
    为什么要检查
    计数器
    是否为零,而不是
    值[i]
    [0,大小)
    中的
    i
    位置?建议不要使用
    abs()
    size\t计数器=0;对于(size\t i=size;i>0;){if(value[--i]!=0.0)计数器+++
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    double fRand(double fMin, double fMax) {
       double f = (double)rand() / RAND_MAX;
       return fMin + f * (fMax - fMin);
    }
    
    int main(void) {
       int i;
       int nZeroes = 0;
       int nElements = 20;
       double* lfArray;
       if ((lfArray = calloc(nElements, sizeof(double))) == NULL) {
          /* Memory error, abort */
          return (-1);
       }
    
       /* Populate array */
       for (i=0; i<nElements; i++) {
          lfArray[i] = fRand(-10.0, +10.0);
       }
       /* Set a few arbitrary elements to 0.0 */
       lfArray[5] = 0.0;
       lfArray[10] = 0.0;
       lfArray[15] = 0.0;
    
       /* Determine how many zeroes are present, and log the results */
       for (i=0; i<nElements; i++) {
          if (fabs(lfArray[i]) == 0.0) {
             nZeroes++;
          }
       }
       printf("Number of zeroes detected:%d\n", nZeroes);
       for (i=0; i<nElements; i++) {
          printf("Element:%02d, Value:%3.4lf\n", i, lfArray[i]);
       }
    
       return 0;
    }
    
    Number of zeroes detected:3
    Element:00, Value:-9.9998
    Element:01, Value:-7.3692
    Element:02, Value:5.1121
    Element:03, Value:-0.8270
    Element:04, Value:0.6553
    Element:05, Value:0.0000
    Element:06, Value:-9.0591
    Element:07, Value:3.5773
    Element:08, Value:3.5859
    Element:09, Value:8.6939
    Element:10, Value:0.0000
    Element:11, Value:0.3883
    Element:12, Value:6.6193
    Element:13, Value:-9.3086
    Element:14, Value:-8.9308
    Element:15, Value:0.0000
    Element:16, Value:3.4230
    Element:17, Value:-9.8460
    Element:18, Value:-2.3317
    Element:19, Value:-8.6632
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    double fRand(double fMin, double fMax) {
       double f = (double)rand() / RAND_MAX;
       return fMin + f * (fMax - fMin);
    }
    
    int main(void) {
       int i;
       float lowerLimit = -0.001;
       float upperLimit = +0.001;
       int nZeroes = 0;
       int nElements = 20;
       double* lfArray;
       if ((lfArray = calloc(nElements, sizeof(double))) == NULL) {
          /* Memory error, abort */
          return (-1);
       }
    
       /* Populate array */
       for (i=0; i<nElements; i++) {
          lfArray[i] = fRand(2.0*lowerLimit, 2.0*upperLimit);
       }
    
       /* Determine how many zeroes are present, and log the results */
       for (i=0; i<nElements; i++) {
          if (fabs(lfArray[i]) < upperLimit) {
             lfArray[i] = 0.0;
             nZeroes++;
          }
       }
       printf("Number of zeroes detected:%d\n", nZeroes);
       for (i=0; i<nElements; i++) {
          printf("Element:%02d, Value:%3.4lf\n", i, lfArray[i]);
       }
    
       return 0;
    }
    
    Number of zeroes detected:9
    Element:00, Value:-0.0020
    Element:01, Value:-0.0015
    Element:02, Value:0.0010
    Element:03, Value:0.0000
    Element:04, Value:0.0000
    Element:05, Value:-0.0011
    Element:06, Value:-0.0018
    Element:07, Value:0.0000
    Element:08, Value:0.0000
    Element:09, Value:0.0017
    Element:10, Value:0.0000
    Element:11, Value:0.0000
    Element:12, Value:0.0013
    Element:13, Value:-0.0019
    Element:14, Value:-0.0018
    Element:15, Value:0.0000
    Element:16, Value:0.0000
    Element:17, Value:-0.0020
    Element:18, Value:0.0000
    Element:19, Value:-0.0017