c++ - 一个奇怪的打印功能错误

标签 c++

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

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 标准未指定如何舍入负数除法)。

第二个版本也可能打印不正确的结果:如果值很大,转换为 float 会降低精度(因为 double float 不能准确表示所有 64 位整数),所以结果可能会偏离一点。

关于c++ - 一个奇怪的打印功能错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13744177/

相关文章:

c++ - 将数据从 PC 发送到微 Controller

c++ - 如何使用 C++11 可变参数模板来定义由 vector 元组支持的元组 vector ?

c++ - 找出字符串是否仅包含给定字符集的最佳方法/算法

c++ - 拆分数组字符

c++ - 仅在基于范围的循环中迭代奇数(偶数)元素

c++ - new int[n]() 是如何工作的?

c++ - 使用 boost::serialization 将派生类指针序列化为 vector 的问题

c++ - 取消引用指向其类内对象的指针

c++ - .c 文件是否应该包含 .h 文件已经包含的内容?

Windows ME 上的 C++