【发布时间】:2015-12-17 08:53:54
【问题描述】:
我编写了以下程序,旨在比较 C++ 中的 float。最初这是为了比较double 而写的,但我很快意识到这是一个多么糟糕的问题。一般来说,应该发生的是程序将比较给定slot数组的两个数字并根据需要交换它们。
#include<iostream>
using namespace std;
int swap(float[] , int, int);
int main() {
float slot[10] = {8.25, 3.26, 1.20, 5.15, 7.99, 10.59, 4.36, 9.76, 6.29, 2.09};
int n=10, i;
int lower, upper, sortflag, sml, scan;
lower = 0;
upper = n-1;
sortflag = 1;
float temp;
while( (lower < upper) && (sortflag == 1)) {
sml = lower;
sortflag = 0;
scan = lower + 1;
while(scan <= upper - lower) {
if (slot[scan] > slot[scan + 1]) {
swap(slot, scan, scan + 1);
sortflag = 1;
if(slot[scan] < slot[sml]) sml = scan;
}
scan++;
}
swap(slot, lower, sml);
upper = upper - 1;
lower = lower + 1;
}
cout << "AFTER SORT: " << endl;
for (i= 0; i < n; i++) cout << slot[i] << " ";
cout << endl;
return 0;
}
void swap(float data[], int i, int j) {
float temp;
temp = data[i];
data[j] = data[i];
data[j] = temp;
}
当我使用double 而不是float 运行这个程序时,程序无限运行,直到我不得不调用Ctrl+C 来中断它。切换到float 后,我得到以下输出:
AFTER SORT:
8.25 8.25 3.26 5.15 7.99 10.59 10.59 10.59 10.59 10.59
0 0 1 3 4 5 5 5 5 5
--------------------------------
Process exited after 0.06651 seconds with return value 0
Press any key to continue . . .
逻辑哪里出错了?
编辑:经过一番考虑,我继续重写程序,让它比较 int 数组值。
int slot[10] = {8, 3, 1, 5, 7, 10, 4, 9, 6, 2};
并根据需要调整所有适当的功能: // 函数声明: 无效交换(int[],int,int);
void swap(int data[], int i, int j) {
int temp;
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
现在功能正确,输入正确。这里出界没有问题。
AFTER SORT:
1 2 3 4 5 6 7 8 9 10
--------------------------------
Process exited after 0.05111 seconds with return value 0
Press any key to continue . . .
这是修改后的新程序:
int main() {
int slot[10] = {8, 3, 1, 5, 7, 10, 4, 9, 6, 2};
int n=10, i;
int lower, upper, sortflag, sml, scan;
lower = 0;
upper = n-1;
sortflag = 1;
while( (lower < upper) && (sortflag == 1)) {
sml = lower;
sortflag = 0;
scan = lower + 1;
while(scan <= (upper-lower)) {
if (slot[scan] > slot[scan + 1]) {
swap(slot, scan, scan + 1);
sortflag = 1;
if(slot[scan] < slot[sml]) sml = scan;
}
scan++;
}
swap(slot, lower, sml);
upper = upper - 1;
lower = lower + 1;
}
cout << "AFTER SORT: " << endl;
for (i= 0; i < n; i++) cout << slot[i] << " ";
cout << endl;
//for (i= 0; i < n; i++) cout << index[i] << " ";
cout << endl;
return 0;
}
void swap(int data[], int i, int j) {
int temp;
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
所以现在的问题是为什么int 版本可以正常工作,而double 和float 版本都没有问题?
【问题讨论】:
-
使用调试器并逐步解析。确保您没有越界访问。
-
如果您进行文本搜索并将“float”替换为“double”,您的程序可以正常工作并产生相同的结果
-
@ManosNikolaidis 那会不会是我的编译器产生了错误?
-
@PaulWilliams 我用 gcc 试过了。你用的是什么编译器?另请查看第二个
swap函数。你可能想要一个int temp;那里。 -
此时在代码
if (slot[scan] > slot[scan + 1])中,scan+1可能为 10。slot[10]将超出插槽数组的边缘(从零开始)。
标签: c++ sorting floating-point