用于整数除法的C ++函数,具有明确的舍入策略 [英] C++ functions for integer division with well defined rounding strategy

查看:166
本文介绍了用于整数除法的C ++函数,具有明确的舍入策略的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要在C ++中的一些东西,让我可以用指定的舍入行为进行有效的整数除法,类似这样:

I want something in C++ that lets me do efficient integer division with specified rounding behavior, something like this:

div_down(-4,3)        ==> -2
div_up(4,3)           ==> 2
div_to_zero(-4,3)     ==> -1
div_to_nearest(5,3)   ==> 2



我希望它能够在编译时检测目标机器的行为,并生成相应的最佳实现。类似于模数的东西也很不错,在编译时抽象出负操作数的未定义的行为。

I'd like it to detect target machine behavior at compile time and generate the appropriate optimal implementations. Something similar for modulus would also be nice, abstracting out the undefined behavior for negative operands at compile time.

这是否存在?

如果没有,什么是一个很好的方法来做呢?我可以想到几种可能的方法:

If not, what's a nice way to make it? I can think of a few possible approaches:


  • 尝试将它们实现为静态优化的单个表达式

  • 使用常量表达式来检测目标行为并从多个实现中选择,也许使用模板(但是如何确切地)。

推荐答案

这是我到目前为止,前提条件d> 0。他们都似乎工作,但可以简化?

This is what I've got so far, with the precondition d > 0. They all seem to work, but can they be simplified?

int div_down(int n, int d) {
  if (n < 0) {
    return -((d - n - 1) / d);
  } else {
    return n / d;
  }
}

int div_up(int n, int d) {
  if (n < 0) {
    return -(-n / d);
  } else {
    return (n + d - 1) / d;
  }
}

int div_to_zero(int n, int d) {
  return n / d;
}

int div_to_nearest(int n, int d) {
  if (n < 0) {
    return (n - d/2 + 1) / d;
  } else {
    return (n + d/2) / d;
  }
}

这篇关于用于整数除法的C ++函数,具有明确的舍入策略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆