函数不返回小数,有时返回错误值?
Posted
技术标签:
【中文标题】函数不返回小数,有时返回错误值?【英文标题】:Function not returning decimal and sometimes wrong value? 【发布时间】:2017-11-07 23:37:01 【问题描述】:我正在尝试通过使用头文件中定义的函数并将斜率返回给主函数来计算用户输入的斜率。
我现在的问题是有时程序计算的斜率是错误的,即使我的公式是正确的。
有时给定的斜率只是向上或向下四舍五入并随机为负。我在这里做错了吗?
我的主要代码:
#include <iostream>
#include "findSlope.h"
using namespace std;
int main()
float p1, p2, p3, p4, rep, slope;
int i;
cout << "input point 1:";
cin >> p1;
cout << "input point 2:";
cin >> p2;
cout << "input point 3:";
cin >> p3;
cout << "input point 4:";
cin >> p4;
cout << "input amount of repetition:";
cin >> rep;
cout << "\nYour points are =" << p1 << "\t"
<< p2 << "\t" << p3 << "\t" << p4;
for ( i=0;i<rep;i++)
slope = findSlope(p1,p2,p3,p4,rep);
cout << "Point 1\tPoint2\tSlope\n";
cout << "("<<p1<<","<<p2<<")\t";
cout << "("<<p3<<","<<p4<<")\t";
cout << slope;
return 0;
我的头文件:
#include <iostream>
using namespace std;
findSlope(float p1,float p2,float p3,float p4,float rep)
float slope;
cout << "\nInput your first coordinates (seperated by space) :";
cin >> p1 >> p2;
cout << "Input your second coordinates (seperated by space) :";
cin >> p3 >> p4;
slope = (p4-p2)/(p3-p1);
return slope;
【问题讨论】:
main
要求用户输入一些数字,并将它们传递给findSlope
。后者完全忽略这些参数,要求用户输入更多的数字,并对这些参数进行计算。你是这个意思吗?
不要在头文件中定义函数。 Don't do using namespace std;
in header files(或in general)。了解header include guards 和#pragma once
。并阅读编译器警告(如果您没有收到任何警告,则启用更多)。
你的 for
循环计算同样的事情 rep
次。你是这个意思吗?
findSlope
没有返回类型。您的编译器可能假定int
,并将float
返回值重新解释为int
。应该是float findSlope(...) ...
您可能需要澄清您的术语。一个点有两个坐标。当您提示用户时,您要求 4 个坐标或 2 个点。
【参考方案1】:
原则上这段代码不应该在 C++ 中编译,因为你没有指定 findSlope()
函数的类型。
如果您使用-fpermissive
编译器标志强制编译,则函数将为considered as returning an int
。从 float 到 int 的转换可以解释您描述的奇怪行为(在转换溢出的情况下截断和否定)。
尝试使用以下代码更正代码:
float findSlope(float p1,float p2,float p3,float p4,float rep)
...
杂记:
您可以考虑使用double
而不是float
。精度更高,现代 CPU 的开销也没有那么高。
您在findSlope.h
标头中做了两件您不应该做的事情:首先您使用的命名空间会污染包括该标头在内的所有文件;其次,您定义一个函数,这样如果您在不同的编译单元中包含相同的头文件,每个 .cpp 文件都会重新编译该函数,这可能会导致链接器错误。
【讨论】:
以上是关于函数不返回小数,有时返回错误值?的主要内容,如果未能解决你的问题,请参考以下文章