gpt4 book ai didi

c++ - 从较大的数字类型转换为较小的数字类型时,潜在的陷阱是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:30 25 4
gpt4 key购买 nike

假设我正在使用返回 double 的函数 foo 但我在我的程序中使用 float(按照惯例例如在许多计算机图形应用程序中)。我懒得为 float 重写 foo 因为我没有在很多地方使用 in 并且空间(可能还有速度)开销不够大证明为此的时间。使 foo 成为适用于多种类型的函数模板也不是一种选择,因为该函数来自库。

我有多种选择来处理这种情况:

1) 按原样使用函数:

float f = foo();

这给出了一个编译器警告“可能丢失数据”,我想消除它,因为我确信在这种特殊情况下精度丢失不是问题。

2) 显式转换为 float :

float f = static_cast<float>(foo());

消除了警告并让读者清楚地知道我正在此处转换为 float ,但这使得快速掌握正在发生的事情变得更加困难,尤其是当行变长或我必须转换多个参数时。

3) 编写一个隐藏转换为 float 的包装器

float foo_float() { return static_cast<float>foo(); }
float f = foo_float();

没有警告并且比 (2) 更容易阅读,但可能导致许多函数/lambda 并没有真正添加新功能。

我想知道:

  1. 是否有更多方法来处理这种情况?
  2. 我是否遗漏了三种方法中任何一种的陷阱?

请注意,当我可以确定函数的结果适合我使用的较小类型时,同样的问题可能会发生在整数类型上。

最佳答案

你问:

Are there more ways to deal with this situation?

是的,例如处理溢出 - 有一个名为 Numeric Conversion 的图书馆暴露并帮助处理这种情况。 (特别是 numeric_cast)

Am I missing pitfalls in one of the three approaches?

溢出。此外,在代码中留下此类已知警告通常是 Not Acceptable 。


Overview

The Boost Numeric Conversion library is a collection of tools to describe and perform conversions between values of different numeric types.

The library includes a special alternative for a subset of std::numeric_limits<>, the bounds<> traits class, which provides a consistent way to obtain the boundary values for the range of a numeric type.

It also includes a set of trait classes which describes the compile-time properties of a conversion from a source to a target numeric type. Both arithmetic and user-defined numeric types can be used.

A policy-based converter object which uses conversion_traits to select an optimized implementation is supplied. Such implementation uses an optimal range checking code suitable for the source/target combination.

The converter's out-of-range behavior can be customized via an OverflowHandler policy.
For floating-point to integral conversions, the rounding mode can be selected via the Float2IntRounder policy.
A custom low-level conversion routine (for UDTs for instance) can be passed via a RawConverter policy.
The optimized automatic range-checking logic can be overridden via a UserRangeChecker policy.

关于c++ - 从较大的数字类型转换为较小的数字类型时,潜在的陷阱是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55353813/

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