gpt4 book ai didi

c# - 如何整数除以负数*向下*?

转载 作者:IT老高 更新时间:2023-10-28 21:49:35 33 4
gpt4 key购买 nike

似乎每当我用一个负整数除以一个正整数时,我都需要它向下舍入 (向 -inf),而不是向 0。但 C# 和 C++ 都向 0 舍入。

所以我想我需要一个 DivideDownward() 方法。我可以用几行来写它,测试是否定的等等,但我的想法似乎很糟糕。所以我想知道我是否遗漏了什么,以及你是否有一种“优雅”的方式来向下舍入负除法。

最佳答案

Whenever I divide a negative int by a positive int, I need it to round down.

这是 hell ,不是吗? Knuth 写了为什么这是做事的正确方法,但我们被传统的整数硬件所困。

  • 如果你能承受精度损失,最简单和最干净的方法是将 32 位整数转换为 64 位 double 并使用 FP 舍入模式当您将商转换回整数时,向负无穷大舍入。今天的浮点单元非常快,实际上可能比整数单元除法;可以肯定的是,你必须测量。

  • 如果您需要完整的 64 位整数精度,作为编译器编写者,我已经通过执行两个条件分支来处理这个问题,以便您最终划分幅度,然后得到正确的符号。但这是不久前条件分支与除法相比便宜的时候了。在今天的硬件上,我必须先进行试验,然后才能推荐一些东西。

  • 原则上,您可以使用传统的英特尔 80 位 float 在 64 位整数上使用浮点技巧,但它非常不可移植,我不相信英特尔会继续制作那个单位快。这些天浮点速度在 SSE 单元中。

  • 寻找其他技巧的地方包括 Hank Warren 的书 Hacker's Delight (我的拷贝正在工作)和MLton标准 ML 的编译器,要求整数除法向负无穷大舍入。

无论你做什么,当你确定它时,如果你使用的是 C++ 或 C99,请将你的除法例程粘贴到一个 .h 文件中并使其静态内联。这样一来,当您的解决方案对于 5 年内交付的新 whizbang 硬件来说并不理想时,您可以在一个地方进行更改。

关于c# - 如何整数除以负数*向下*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3041946/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com