C++ 一个奇怪的打印函数错误

C++ 一个奇怪的打印函数错误,c++,C++,我正在处理一个InterviewStreet问题,算法是正确的,但我仍然得到几个错误的答案,几个小时后,我发现问题与打印功能有关: void printHalf(int64_t x) { if (x % 2 == 0) printf("%lld\n", x / 2L); else printf("%lld.5\n", x / 2L); } 此函数接受64位整数,并打印其一半。如果我将此函数更改为以下代码,则我的解决方案适用于所有测试用例: voi

我正在处理一个InterviewStreet问题,算法是正确的,但我仍然得到几个错误的答案,几个小时后,我发现问题与打印功能有关:

void printHalf(int64_t x) {
    if (x % 2 == 0)
        printf("%lld\n", x / 2L);
    else
        printf("%lld.5\n", x / 2L);
}
此函数接受64位整数,并打印其一半。如果我将此函数更改为以下代码,则我的解决方案适用于所有测试用例:

void printHalf(int64_t x) {
    if (x % 2 == 0)
        printf("%lld\n", x / 2L);
    else
        printf("%.1f\n", x / 2.0);
}

我觉得这有点奇怪,因为我认为这两个函数的结果相同。

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

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


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

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

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


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

你能举一个例子说明第一个版本的答案有错吗?@hall.stephenk我不知道,因为这正是我所要求的。你能举一个例子说明第一个版本的答案有错吗?@hall.stephenk我不知道,因为这正是我所要求的。这就是问题到底出在哪里,非常感谢您指出!至于第二个版本,参数x实际上在uint32_t的范围内,因此我猜它可以用双精度浮点表示。这正是问题所在,非常感谢您指出!至于第二个版本,参数x实际上在uint32_t的范围内,因此我猜它可以用双精度浮点表示。