4

当我运行它时,在 main() 中 cout 打印 5.395。但是断言说它失败了!这真是令人难以置信,为什么会发生这种情况?

#include <iostream>
#include <cassert>

using namespace std;

const float A = 1.6;
const float C = 1.55;
const float G = 2.2;
const float T = 1.23;

char empty[18];
int arraySize;


void copyArray(char sourceArray[], char targetArray[], int size) {
    for(int i=0;i<size;i++) {
        targetArray[i] = sourceArray[i];
        }
    }



double getAvgDensity(char aminoAcid) {

char aminoUpper = toupper(aminoAcid);
aminoToArray(aminoUpper);
    double counter = 0;
    int codonTotal = arraySize / 3.0;
    if (arraySize == 0)
        return 0;
    else
    {
    for (int i = 0; i < arraySize; i++) {
        counter += charToDouble(empty[i]);
        }

    return (counter / codonTotal);
    }

}


int main()
{
    cout << getAvgDensity('A') << endl;  // prints 5.395
    assert(getAvgDensity('A')==5.395);
    return 0;
}

编辑:感谢所有答案,我只是乘以 1000,转换为 int,转换回 double 并除以 1000。:)

4

3 回答 3

10

啊,浮点数。

比如说,实际的回报getAvgDensity()5.395000000000000000000000001。这不是技术上的== 5.395,是吗?当然,打印会丢弃所有那些讨厌的尾随小数,但值仍然不同。

使用浮点数时,您必须自己决定什么是“相等”的可接受定义。手动舍入数字,或将其与<=/>=和合适的误差范围进行比较。

于 2013-03-13T00:21:20.413 回答
1

这已经得到了回答,但我会加两分钱。如果您打算经常这样做,您可能会发现创建一个比较双精度数的函数很有用。这个想法是检查fabs(a-b) < epsilon哪里epsilon是一个代表可容忍错误量的小值。

bool is_equal( double a, double b, const double epsilon = 1e-5 )
{
    double c = a - b;
    return c < epsilon && -c < epsilon;  // or you could use fabs(c) < epsilon
}

那么这只是一个例子:

assert( is_equal(getAvgDensity('A'), 5.395) );
于 2013-03-13T01:16:47.087 回答
0

原因是 cout 默认不会打印到那么高的精度。尝试以下操作:

int main()
{
    std::cout.precision(25);
    cout << getAvgDensity('A') << endl;  // prints 5.395
    assert(getAvgDensity('A')==double(5.395));
    return 0;
}
于 2013-03-13T00:24:50.537 回答