一个奇怪的打印功能错误

A strange print function bug

本文关键字:打印 功能 错误 一个      更新时间:2023-10-16

我正在研究一个 InterviewStreet 问题 https://www.interviewstreet.com/challenges/dashboard/#problem/4fcf919f11817,算法是正确的,但我仍然得到几个错误的答案,几个小时后我发现问题与打印功能有关:

void printHalf(int64_t x) {
    if (x % 2 == 0)
        printf("%lldn", x / 2L);
    else
        printf("%lld.5n", x / 2L);
}

此函数采用 64 位整数,并打印其一半。如果我将此函数更改为以下代码,则我的解决方案适用于所有测试用例:

void printHalf(int64_t x) {
    if (x % 2 == 0)
        printf("%lldn", x / 2L);
    else
        printf("%.1fn", x / 2.0);
}

这对我来说看起来有点奇怪,因为在我看来这两个函数具有相同的结果。

您的第一个版本无法正确处理值-1。如果你运行printHalf(-1)它会打印0.5,因为它不知道它需要显示-0而不是0

对于其他负值,它将在 C++11 中正常工作,但依赖于 C++03 中实现定义的行为(C++03 标准未指定负数的除法如何舍入)。

第二个版本也可能打印不正确的结果:如果值非常大,转换为浮点数将降低精度(因为双精度浮点数不能准确地表示所有 64 位整数),因此结果可能会偏差一点。