- 计算三角形面积
讨论讨论,急需解答解答
- @ 2026-9-25 17:11:34
老师这里说的不是单精度浮点数吗,为什么定义变量不用float,而是double
3 comments
-
Myobot @ 2026-9-27 9:10:17
同学你好,这个问题问得很好,说明你在认真读题、也在思考数据类型的细节。
先纠正一个常见的误解:题目里说的“单精度浮点数”,是在描述输入数据的格式和规模,而不是强制你只能用
float来存。这一点 PomeloGPT 说得对——输入是单精度 ≠ 必须用 float 存。那么为什么实际写题时更推荐用
double呢?你可以从这几个角度想一想:1. 中间运算的精度损失 题目要求输出精确到小数点后两位。无论用海伦公式还是叉乘公式,中间都会涉及乘法、减法、开方等运算。
float只有约 6~7 位有效数字,而double有约 15~16 位。当坐标稍大、或三点接近共线时,float的舍入误差可能被放大,最后两位小数就出错了。2. 误差累积 拿叉乘来说:先算两个向量 → 算叉积 → 取绝对值 → 除以 2。每一步都有舍入,
float下这些误差叠加,最后printf("%.2f")出来的结果可能和标准答案差 0.01,在 OJ 上就是 WA。3. 代价极小 多用一个
double不会让你超时或超空间。在绝大多数 OJ 环境下,double���运算速度和float相差无几,内存也就多几个字节,完全值得。所以结论是:题目说“单精度浮点数”是在描述输入规模,不是限制你的变量类型。为了保险,坐标和中间结果一律用
double存,输出时用%.2f格式化。顺便提醒两个易错点:
scanf读double必须用%lf,用%f是错的;而printf输出double用%f即可。- 如果用海伦公式,注意
p-a、p-b、p-c在三点接近共线时可能出现极小的负数(浮点误差导致),开方前要小心,这也是为什么很多人更偏好叉乘公式。
你可以再想一个问题:如果三个点几乎共线,用海伦公式和用叉乘公式,哪个更容易出现精度问题?为什么? 想清楚这个,你对浮点误差的理解会更进一步。
-
@ 2026-9-27 9:10:08如果碰到小数问题建议直接开double存,float会有比较严重的精度丢失问题,还有就是输入为单精度数!=要用float存
-
@ 2026-9-25 17:11:38
同学你好,这个问题问得很好,说明你在认真看题、也在思考数据类型的细节。
先纠正一个容易混淆的点:题目里的“单精度浮点数”指的是输入数据的格式描述,它告诉你这些坐标值在题目数据中不会特别大、精度要求不高,而不是强制你只能用
float来存。那么为什么实际写题时更推荐
double呢?你可以从下面几个角度想一想:-
中间运算的精度损失 题目要求输出精确到小数点后两位。海伦公式或叉乘公式里会涉及开方、乘法、减法等运算。
float只有大约 6~7 位有效数字,而double有大约 15~16 位。当坐标值稍大、或者三角形三个点接近共线时,float的舍入误差可能被放大,导致最后两位小数出错。 -
误差累积 比如用叉乘算面积:先算两个向量、再算叉积、再取绝对值、再除以 2。每一步都有舍入。用
float时这些误差叠加起来,最后printf("%.2f")出来的结果可能和标准答案差 0.01,这在 OJ 上就是 WA。 -
代价很小 多用一个
double并不会让你的程序超时或超空间。在绝大多数 OJ 环境下,double的��算速度和float相差无几,内存占用翻倍但也就几个字节,完全可以接受。
所以结论是:题目说“单精度浮点数”是在描述输入规模,不是限制你的变量类型。为了保险起见,坐标和中间结果一律用
double来存,输出时再用%.2f格式化即可。顺便提醒一下,用
%f读入double是错的,scanf读double要用%lf,printf输出double用%f就行。这个细节也常有人踩坑。你可以再想想:如果三个点几乎共线,用海伦公式和用叉乘公式,哪个更容易出现精度问题?为什么?想清楚这个,你对浮点误差的理解会更上一层楼。
-
- 1
Information
- ID
- 563
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- (None)
- # Submissions
- 639
- Accepted
- 243
- Uploaded By