【问题标题】:Comparing double in C++比较 C++ 中的双精度
【发布时间】: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 版本可以正常工作,而doublefloat 版本都没有问题?

【问题讨论】:

  • 使用调试器并逐步解析。确保您没有越界访问。
  • 如果您进行文本搜索并将“float”替换为“double”,您的程序可以正常工作并产生相同的结果
  • @ManosNikolaidis 那会不会是我的编译器产生了错误?
  • @PaulWilliams 我用 gcc 试过了。你用的是什么编译器?另请查看第二个swap 函数。你可能想要一个int temp; 那里。
  • 此时在代码if (slot[scan] &gt; slot[scan + 1]) 中,scan+1 可能为 10。slot[10] 将超出插槽数组的边缘(从零开始)。

标签: c++ sorting floating-point


【解决方案1】:

你的交换功能是错误的。 data[j] = data[i]; 后面跟着另一个写 data[j] = temp; 是没用的。应该是这样的

int swap(float data[], int i, int j) {

    float temp;

    temp = data[i];
    data[i] = data[j]; // reverse this line
    data[j] = temp;

    return 0;
}

如果你不使用结果,那么让函数返回int 是没有意义的。只需声明void

【讨论】:

  • 虽然这修复了一个错误,但它并没有修复整个程序。超出数组边界也是一个问题。应该注意的是,这两个交换函数都会遇到同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2016-12-19
相关资源
最近更新 更多