将 float 转换为 UInt32 - 哪个表达式更精确

2024-02-06

我有一个号码float x它应该在 范围内,但它经过多次数值运算 - 结果可能稍微超出 范围。

我需要将这个结果转换为uint y使用整个范围的UInt32。当然,我需要夹住x在 范围内并对其进行缩放。

但哪种操作顺序更好呢?

y = (uint)round(min(max(x, 0.0F), 1.0F) * UInt32.MaxValue)

or

y = (uint)round(min(max(x * UInt32.MaxValue, 0.0F), UInt32.MaxValue)

换句话说,是先缩放,然后夹紧,还是夹紧,然后缩放?我对IEEE浮点表示不是很深入,但我相信上述表达式的计算顺序存在差异。


因为从 [0.0f .. 1.0f] 到 [0 .. UInt32.MaxValue] 的乘法本身可以是近似的,所以最明显具有您想要的属性的操作顺序是乘法,然后钳位,然后舍入。

The maximum value to clamp to is the float immediately below 232, that is, 4294967040.0f. Although this number is several units below UInt32.MaxValue, allowing any larger value would mean overflowing the conversion to UInt32.

以下任一行都应该有效:

y = (uint)round(min(max(x * 4294967040.0F, 0.0F), 4294967040.0F))

在第一个版本中,您可以选择乘以UInt32.MaxValue反而。选择是总体结果稍大一些(因此舍入到 4294967040 一些接近 1.0f 但低于它的值),或者仅将 1.0f 及以上的值发送到 4294967040。


您还可以钳位到 [0.0f .. 1.0f]如果你之后没有乘以太大的数字,这样就不会有使值大于可转换的最大浮点数的风险:

y = (uint)round(min(max(x, 0.0F), 1.0F) * 4294967040.0F)

请在下面提出您的评论建议,关于制作高达UInt32.MaxValue:

if (x <= 0.0f) y = 0
else if (x < 0.5f) y = (uint) round (x * 4294967296.0F)
else if (x >= 1.0f) y = UInt32.MaxValue
else y = UInt32.MaxValue - (uint) round ((1.0f - x) * 4294967296.0F)

该计算被视为函数x to y正在增加(包括 0.5f 左右)并且上升到UInt32.MaxValue。您可以根据您认为最可能的值分布对测试重新排序。特别是,假设实际上很少有值低于 0.0f 或高于 1.0f,您可以首先与 0.5f 进行比较,然后仅与相关的界限进行比较:

if (x < 0.5f)
{
  if (x <= 0.0f) y = ...
  else y = ...
}
else
{
  if (x >= 1.0f) y = ...
  else y = ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 float 转换为 UInt32 - 哪个表达式更精确 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 当目标路径包含表情符号字符时,复制快捷方式文件(*.lnk)的目标

    我的目标是编写一个简单的 Powershell 脚本 该脚本将采用一个强制参数 该参数必须是快捷方式 lnk 文件的完整文件路径 然后该脚本将解析快捷方式的目标项 文件或目录 并将其复制到脚本的当前工作目录中 我发现的问题是在测试其目标项指
  • 如何使用 no_std 和分配器将输出格式化为字节数组?

    我想做类似的事情 let x 123 let mut buf 0 as u8 20 format to x gt buf assert eq buf 3 b 123 With no std 并且没有任何内存分配器 据我了解 有一个实现cor
  • MATLAB JA Builder 在 MCRConfiguration 中引发 NullPointerException

    我正在尝试使用 JA Builder 从 Java 执行 MATLAB 函数 我遵循 MATLAB JA Builder 帮助文档 HelloWorld 和 MagicSquare 示例 每次都会收到以下堆栈跟踪 Exception in
  • Kendo UI DropDownList 更改触发事件

    我是第一次使用 Kendo UI 在触发 Kendo 下拉列表更改中的功能时遇到一些困难 我的目标是根据用户的下拉选择显示不同的搜索字段 我尝试了几种不同的方法 但似乎没有任何效果 有人有一个简单的 jQuery 片段可以获取 Kendo
  • 如何使用 Chrome Devtools 协议接收嵌入式 iframe 的事件?

    我正在尝试使用Chrome 开发者工具协议 https chromedevtools github io devtools protocol tot Network 列出选项卡的网络和日志事件 我成功地为顶级框架做到了这一点 但在儿童 if
  • 在 Eclipse 的 Android 设备中看不到 Nexus7 [重复]

    这个问题在这里已经有答案了 可能的重复 ADB 无法识别我的 Galaxy Nexus Win7 https stackoverflow com questions 8801829 adb dosnt recognize my galaxy
  • Java 8用于计算小数年龄的日期时间[重复]

    这个问题在这里已经有答案了 我是 Java 8 日期时间 API 的新手 想知道如何计算以小数表示的年龄 它返回双精度值 例如 30 5 这意味着 30 年零 6 个月 例如 下面的示例代码得到的输出为 30 0 但不是 30 5 这可能是
  • 散列和索引有什么区别?

    我研究了 DBMS 中的哈希 可扩展 线性 和 DBMS 中的索引 稀疏 密集 基于辅助键的索引等 但我无法理解哈希和索引之间的区别 这两种技术是一起使用还是单独使用 我很困惑 因为这两种技术的目的似乎都是为了让我们能够快速检索数据 所以我
  • EL 语法错误是 en

    JSP页面中的以下语句在第一个附近遇到错误equals出现这种情况 请问是什么原因 如何解决 请尽快纠正 fn length updateStock todayDimensionStones i count DimensionStones
  • 以编程方式获取当前页面

    在 JSF 支持 Bean 托管 Bean 焊接 Bean 无关紧要 中 我可以通过调用获取客户端所在的上下文路径 FacesContext ctx FacesContext getCurrentInstance String path c
  • C# 线程问题和最佳实践

    这是我第一次在 C 应用程序中使用线程 基本上它是一个应用程序 用于检查列表中的一堆网站是死是活 这是我第一次尝试使用多线程 public void StartThread string URL int no Thread newThrea
  • application(_:didFinishLaunchingWithOptions:)' 几乎符合可选要求

    安装 Xcode 8 beta 6 后 我收到一条警告 实例方法 application didFinishLaunchingWithOptions 几乎匹配协议 UIApplicationDelegate 的可选要求 applicatio
  • 如何在 Blackberry BrowserField 中缓存

    我正在创建一个 Blackberry 应用程序来显示某个站点的全屏 Web 视图 我有一个可以正常显示的工作浏览器字段 但从页面到页面的导航速度比本机浏览器慢 浏览器字段似乎没有内置缓存 导致加载时间很慢 当我添加以下代码来管理缓存时 该站
  • FlipSide 上带有导航控制器和表格视图的实用应用程序

    我对整个 MVC 看待事物的方式还比较陌生 我有一个基于 实用程序 应用程序模板的应用程序 MainView 和 FlipsideView 中的所有内容都运行良好 但现在我需要将 TableView 和导航控制器添加到 Flipside 主
  • igraph错误无法创建具有负数顶点的空图

    当我尝试创建下面的简单图表时 为什么会出现错误 如果我用数字替换 a 和 b 那么它可以工作吗 任何解决方案 g1 lt graph c a b directed TRUE error is Error in graph c a b dir
  • 在 hibernate 聚合函数中使用函数作为参数

    我想在 HQL 中执行以下查询 select count distinct year foo date from Foo foo 但是 这会导致以下异常 org hibernate hql ast QuerySyntaxException
  • 如何在 Dynamics 365 On-Premise 中使用 EasyRepro 自动登录

    我正在尝试使用 Dynamics 365 On Premise 中的 EasyRepro 进行自动化 UI 测试 我成功完成了测试 但遇到了一个问题 我无法自动登录到我的 Dynamics 365 Organization 下面是我使用的代
  • 如何在VBA中进行后期绑定?

    我有一个通过 VBA 创建电子邮件的函数 我通过 Excel 2016 做到了这一点 当我的一些同事尝试使用它时 出现了缺少引用的错误 Outlook Library 16 0 我在互联网上寻找解决方案 发现最好的是后期绑定 我已经阅读过它
  • JButton 边距。当雨云普拉夫时不受尊重

    该物业margin of a JButton安装 Nimbus 外观后不会受到尊重 我需要一些 小 按钮 但 nimbus 强制按钮文本周围的空间变大 所以我只得到 非常大 的按钮 我发现在Nimbus 默认页面 http docs ora
  • 将 float 转换为 UInt32 - 哪个表达式更精确

    我有一个号码float x它应该在 范围内 但它经过多次数值运算 结果可能稍微超出 范围 我需要将这个结果转换为uint y使用整个范围的UInt32 当然 我需要夹住x在 范围内并对其进行缩放 但哪种操作顺序更好呢 y uint roun