断言是错的,用证据证明
Assert is wrong, proven with cout
当我运行这个时,在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,转换回双精度,除以1000。:)
啊,浮点数
例如,getAvgDensity()
的实际返回值是5.395000000000000000000000001
。严格来说不是== 5.395
,对吧?当然,打印会丢弃所有这些烦人的尾随小数,但值仍然不同。
当使用浮点数时,你必须自己决定什么是"equal"的可接受定义。手动四舍五入,或与<=
/>=
和合适的误差范围进行比较。
这个问题已经有人回答了,但我还是要补充一下我的观点。如果您打算经常这样做,您可能会发现创建一个函数来比较双精度体是很有用的。这个想法是检查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) );
原因是cout在默认情况下不会打印到那么高的精度。试试以下命令:
int main()
{
std::cout.precision(25);
cout << getAvgDensity('A') << endl; // prints 5.395
assert(getAvgDensity('A')==double(5.395));
return 0;
}
相关文章:
- 使用分辨率定理用Z3证明
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- 证明构造函数体内的辅助是低效的
- 尝试读取/写入Graphviz DAG值的工作证明会导致segfault
- 如何证明以下算法具有 O(nlogn) 时间复杂度
- 声明"使用命名空间 C;"对于证明 [namespace.udir]/3 中的示例中显示的结果至关重
- 证明shrink_to_fit或交换保证释放矢量的内存
- 请证明这一点的合理性 C++.
- 如何证明 -> 在 int* pMember = &(pSomeType->SomeIntMember) 时不用于顺从;
- 无法理解使用这张地图背后的证明<>方法
- 有没有人有书面证据来保证函数中参数的定义方式与普通变量声明相同?
- basic_string::替换的超出范围异常,而在范围内,正如调试相同参数的输出所证明的那样
- 正确证明C 中的两个变量合理(我想将它们视为一个变量)
- 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义是合理的
- 证明两指针方法有效(对和)
- 对随机序列进行降采样会降低随机性吗?有没有原理/定理来证明这一点?
- 如何使用 Z3 C++ API 来证明基于输入参数的理论
- 将整数算术与布尔值混合 - Z3 证明器
- 失去了递归功能的证明
- 断言是错的,用证据证明