c++将数字远离零舍入

发布于 2024-08-02 17:56:17 字数 157 浏览 4 评论 0原文

您好,我想在 C++ 中像这样舍入双数(远离零):

  4.2 ---->   5
  5.7 ---->   6
 -7.8 ---->  -8
-34.2 ----> -35

执行此操作的有效方法是什么?

Hi i want to round double numbers like this (away from zero) in C++:

  4.2 ---->   5
  5.7 ---->   6
 -7.8 ---->  -8
-34.2 ----> -35

What is the efficient way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

污味仙女 2024-08-09 17:56:18
inline double myround(double x)
{
  return x < 0 ? floor(x) : ceil(x);
}

正如 Huppie 引用的文章中提到的,这最好表达为一个跨平台工作的模板所有浮点类型

请参阅 http://en.cppreference.com/w/cpp/numeric /math/floorhttp://en.cppreference.com/ w/cpp/numeric/math/floor

或者,感谢 Pax,一个非函数版本:

x = (x < 0) ? floor(x) : ceil(x);
inline double myround(double x)
{
  return x < 0 ? floor(x) : ceil(x);
}

As mentioned in the article Huppie cites, this is best expressed as a template that works across all float types

See http://en.cppreference.com/w/cpp/numeric/math/floor and http://en.cppreference.com/w/cpp/numeric/math/floor

or, thanks to Pax, a non-function version:

x = (x < 0) ? floor(x) : ceil(x);
森林很绿却致人迷途 2024-08-09 17:56:18

CPlusPlus.com 上有一篇关于类似问题的好文章。解决您的问题的简单方法应该是这样的:

double customRound( double value ) const {
   return value < 0 ? floor( value ) : ceil( value );
}

更好的解决方案是文章中提到的,它使用模板:

//--------------------------------------------------------------------------
// symmetric round up
// Bias: away from zero
template <typename FloatType>
FloatType ceil0( const FloatType& value )
{
   FloatType result = std::ceil( std::fabs( value ) );
   return (value < 0.0) ? -result : result;
}

There is a nice article about a similar problem on CPlusPlus.com. The easy solution to your problem should be something like this:

double customRound( double value ) const {
   return value < 0 ? floor( value ) : ceil( value );
}

A better solution is the one mentioned in the article, which uses a template:

//--------------------------------------------------------------------------
// symmetric round up
// Bias: away from zero
template <typename FloatType>
FloatType ceil0( const FloatType& value )
{
   FloatType result = std::ceil( std::fabs( value ) );
   return (value < 0.0) ? -result : result;
}
说谎友 2024-08-09 17:56:18

x < 0 ? Floor(x) : ceil(x); Ruben Bartelink 的方法很好。但请考虑一下 x = -0.0x = NaN 的特殊情况会发生什么。

而不是让 myround(-0.0) 可能返回 +0.01 并让 myround(NaN) 返回一个更改了 NaN 的有效负载,请考虑以下内容。

myround_alt(-0.0) 返回 -0.0

myround_alt(NaN) 更有可能返回未更改的负载 NaN。非数字的东西很棘手并且没有很好的定义。 IAC,它是myround_alt(-0.0) --> -0.0 我正在寻找。

inline double myround_alt(double x) {
  if (x > 0) return ceil(x);
  if (x < 0) return floor(x);
  return x;
}

1IEC 60559 浮点算术 指定 ceil( ±0) 返回 ±0,因此严格遵循该规范的实现不需要此方法。然而,许多 C 浮点实现并不遵循这一点(C 不需要它),或者在像这样的极端情况下失败。

The x < 0 ? floor(x) : ceil(x); approach of Ruben Bartelink is good. Yet consider what happens with special cases of x = -0.0, x = NaN.

Rather than have myround(-0.0) potentially return +0.01 and have myround(NaN) return with a changed payload of the NaN, consider the below.

myround_alt(-0.0) returns -0.0.

myround_alt(NaN) more likely returns an unchanged payload NaN. Not-a-number stuff is tricky and not well defined. IAC, it is the myround_alt(-0.0) --> -0.0 I am seeking.

inline double myround_alt(double x) {
  if (x > 0) return ceil(x);
  if (x < 0) return floor(x);
  return x;
}

1IEC 60559 floating-point arithmetic specifies ceil(±0) returns ±0 so this approach not needed with implementations that strictly follow that spec. Yet many C floating point implementation do not follow that (C does not require it) or fail in such comer cases like this.

孤芳又自赏 2024-08-09 17:56:18

尝试

 double rounded = _copysign(ceil(abs(x)), x);

try

 double rounded = _copysign(ceil(abs(x)), x);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文