Stanley Asked:2022-07-03 11:50:38 +0000 UTC2022-07-03 11:50:38 +0000 UTC 2022-07-03 11:50:38 +0000 UTC E-Olymp 的问题:金字塔的面积和体积 772 任务链接 #include <stdio.h> #include <math.h> int main(void) { float p,d,H,h,S,V; scanf("%f %f",&d,&p); S=d*d + 2*d*sqrt(p*p-(d*d)/4); H=sqrt(p*p - (d*d)/2); V=d*d*H/3; printf("%.3f %.3f",S,V); } 查了很多遍,都没有发现错误,求助! c 2 个回答 Voted Harry 2022-07-03T11:56:25Z2022-07-03T11:56:25Z 修复它float,double你会感到惊喜。 一般来说,一般来说,用浮点计算时,使用double,而不是float。 Best Answer Stanislav Volodarskiy 2022-07-04T04:40:15Z2022-07-04T04:40:15Z 让我们评估该类型是否可以float在此任务中提供所需的准确性。条件是底座的边和边的长度不超过100。那么表面积和体积将分别为27320.508和235702.250。我用你的程序来获取它们。 是否有足够的精度float来表示精确到小数点后三位的体积? 为了检查,让我们输出类型的顺序值float: #include <stdio.h> #include <math.h> int main() { float x = 235702.250; printf("%.10f\n%.10f\n%.10f\n", nextafterf(x, x - 1), x, nextafterf(x, x + 1)); } $ gcc -std=c11 -pedantic -Wall -Wextra -Werror next.c -lm && ./a.out 235702.2343750000 235702.2500000000 235702.2656250000 相邻值之间的差异0.015625。超过千分之一。float根本无法以所需的精度存储这些数字。 让我们将其替换float为double: #include <stdio.h> #include <math.h> int main() { double p, d; if (scanf("%lf %lf", &d, &p) != 2) { return 1; } const double s = d * d + 2 * d * sqrt(p * p - (d * d) / 4); const double h = sqrt(p * p - (d * d) / 2); const double v = d * d * h / 3; printf("%.3lf %.3lf\n", s, v); } $ gcc -std=c11 -pedantic -Wall -Wextra -Werror double.c -lm $ echo 100 100 | ./a.out 27320.508 235702.260 音量不一样!让我们检查一下准确性: #include <stdio.h> #include <math.h> int main() { double x = 235702.260; printf("%.20lf\n%.20lf\n%.20lf\n", nextafter(x, x - 1), x, nextafter(x, x + 1)); } $ gcc -std=c11 -pedantic -Wall -Wextra -Werror next-double.c -lm && ./a.out 235702.25999999998020939529 235702.26000000000931322575 235702.26000000003841705620 连续值之间的差异2.9103830456733704e-11。这足以提供准确的答案。 重要的是要理解,上面的数字并不意味着找到答案3*10^-11。相反,这是一个较低的估计:无法找到比 更好的准确度的答案3*10^-11。程序的实际准确度总是较低。超出此答案范围的分析主题要低多少。人们可以希望准确度double足够:它比必要的高出七个数量级。 float永远不要在没有充分理由的情况下计入。您没有准确的方法来评估计算的准确性。在这种情况下,没有多余的数字。 float如果你不使用它,你为什么需要它? 计算大的数字矩阵,并且没有足够的内存。神经网络属于这一点。 在没有硬件支持的情况下依靠非常弱的硬件来支持真正的算术。例如,在微控制器上,计算 onfloat将明显快于 on double。 在所有其他情况下,double仅
修复它
float,double你会感到惊喜。一般来说,一般来说,用浮点计算时,使用
double,而不是float。让我们评估该类型是否可以
float在此任务中提供所需的准确性。条件是底座的边和边的长度不超过100。那么表面积和体积将分别为27320.508和235702.250。我用你的程序来获取它们。是否有足够的精度
float来表示精确到小数点后三位的体积?为了检查,让我们输出类型的顺序值
float:相邻值之间的差异
0.015625。超过千分之一。float根本无法以所需的精度存储这些数字。让我们将其替换
float为double:音量不一样!让我们检查一下准确性:
连续值之间的差异
2.9103830456733704e-11。这足以提供准确的答案。重要的是要理解,上面的数字并不意味着找到答案
3*10^-11。相反,这是一个较低的估计:无法找到比 更好的准确度的答案3*10^-11。程序的实际准确度总是较低。超出此答案范围的分析主题要低多少。人们可以希望准确度double足够:它比必要的高出七个数量级。float永远不要在没有充分理由的情况下计入。您没有准确的方法来评估计算的准确性。在这种情况下,没有多余的数字。float如果你不使用它,你为什么需要它?计算大的数字矩阵,并且没有足够的内存。神经网络属于这一点。
在没有硬件支持的情况下依靠非常弱的硬件来支持真正的算术。例如,在微控制器上,计算 on
float将明显快于 ondouble。在所有其他情况下,
double仅