我在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
参考资料
fabs()
,访问日期2014-03-28你使用了错误的函数
abs()
返回一个整数值。您确实想使用fabs()
函数。在代码中,由于整数截断,数字的小数部分完全丢失
其次,您可以将该值与0.0进行比较。在ANSI C中,根据C99,可以有正0.0和负0.0,但等效运算符检查(即:=
)仍将报告它们相等/等效
最后,这里使用绝对值函数有点过分了。您真正需要使用它的唯一原因是,如果您想计算数组中的值是否“足够接近”为零
小案例-是零吗?
示例代码
非同寻常的情况-我们是否“足够接近”零? 示例代码-案例2
参考资料
fabs()
,访问日期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