如何正确使用叉乘(cross product)?C语言实现代码结果异常求排查
代码问题定位
你当前的代码存在4个核心错误:
- 语法逻辑错误:误用C语言逗号运算符
你写的float d = ((y1*z2)-(z1*y2), (z1*x2)-(x1*z2), (x1*y2) - (y1*x2));中,括号里的逗号是C的逗号运算符,规则是从左到右执行所有表达式,最终仅返回最后一个表达式的结果。也就是说d最终只存储了叉乘结果的第三个分量x1*y2 - y1*x2的值,前面两个分量的计算结果直接被丢弃了,根本没有保留。 - 功能实现不匹配:函数名和实际逻辑冲突
你声明的函数是叉乘cross_product,叉乘的结果是一个三维向量,不是单个标量,需要分别写入传入的三个result_x/result_y/result_z指针指向的地址,你完全没有使用这三个输出参数,也没有完成向量结果的存储。 - 概念混淆:叉乘和点积搞混
你打印的内容写的是v1 (dot) v2即点积,点积的结果才是单个标量,公式为x1*x2 + y1*y2 + z1*z2,和你当前写的叉乘计算公式完全不同。如果你预期输出是单个标量32,大概率你是搞混了点积和叉乘的实现需求。 - 代码完整性问题
你提供的代码片段没有闭合函数体,也没有返回逻辑,无法正常编译运行。
修正方案
如果你需要实现叉乘功能:
void cross_product( float x1, float y1, float z1, float x2, float y2, float z2, float* result_x, float* result_y, float* result_z){ // 分别计算三个分量,写入输出指针 *result_x = y1*z2 - z1*y2; *result_y = z1*x2 - x1*z2; *result_z = x1*y2 - y1*x2; // 如果需要打印叉乘结果,要打印三个分量 printf("v1 × v2 = <%f, %f, %f>\n", *result_x, *result_y, *result_z); }
如果你实际需要实现点积功能(得到单个标量结果):
float dot_product(float x1, float y1, float z1, float x2, float y2, float z2) { float res = x1*x2 + y1*y2 + z1*z2; printf("v1 (dot) v2 = %f\n", res); return res; }
你预期的32应该是点积的计算结果,用上面的点积函数即可得到对应输出。
内容的提问来源于stack exchange,提问作者student1847
相关产品推荐
相关产品推荐

