Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >浮点数学在C#中是一致的吗?可能是吗?

浮点数学在C#中是一致的吗?可能是吗?
EN

Stack Overflow用户
提问于 2011-07-13 09:29:55
回答 10查看 17.1K关注 0票数 159

不,这不是另一个“为什么是(1/3.0)*3 != 1”的问题。

最近我读了很多关于浮点数的文章,特别是相同的计算如何在不同的架构或优化设置上给出不同的结果()。

对于存储重播的电子游戏,或者是点对点联网 (相对于服务器-客户端)来说,这是一个问题,它依赖于所有客户端每次运行程序时都产生完全相同的结果--一个浮点计算中的微小差异可能会导致不同机器(甚至在同一台机器上!)上的游戏状态大不相同。

即使在“遵循”IEEE-754的处理器中也会发生这种情况,这主要是因为一些处理器(即x86)使用双扩展精度。也就是说,他们使用80位寄存器来做所有的计算,然后截断到64位或32位,导致与使用64位或32位的机器不同的四舍五入结果。

我在网上看到了几种解决这个问题的方法,但都是针对C++的,而不是C#:

  • 禁用双扩展精度模式(使所有double计算使用IEEE-754 64位)使用_controlfp_s (_controlfp_s)、_FPU_SETCW (Linux?)或fpsetprec (BSD)。
  • 始终使用相同的优化设置运行相同的编译器,并要求所有用户具有相同的CPU架构(没有跨平台播放)。因为我的“编译器”实际上是JIT,每次运行时都可能对其进行不同的优化,所以我认为这是不可能的。
  • 使用定点算法,完全避免floatdouble .decimal将为此目的工作,但速度要慢得多,而且没有一个System.Math库函数支持它。

那么,,这在C#中甚至是一个问题吗?,如果我只打算支持Windows (而不是Mono)呢?

如果是的话,有没有办法强迫我的程序以正常的双精度运行?

如果没有,是否有任何库可以帮助保持浮点计算的一致性?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-07-13 13:33:34

我不知道如何使.net中的普通浮点数具有确定性。允许JITter创建在不同平台(或不同版本的.net之间)上行为不同的代码。因此,在确定性的float代码中使用普通.net是不可能的。

我考虑过的解决办法是:

  1. 在FixedPoint32中实现C#。虽然这并不太难(我已经完成了一半的实现),但是非常小的值范围使得使用起来很烦人。你必须时刻小心,这样你就不会溢出,也不会失去太多的精确性。最后,我发现这并不比直接使用整数容易。
  2. 在FixedPoint64中实现C#。我发现这件事很难做。对于某些操作,128位的中间整数将是有用的。但是.net不提供这样的类型。
  3. 实现自定义32位浮点。缺乏BitScanReverse内在特性会在实现这一点时引起一些烦恼。但目前我认为这是最有希望的道路。
  4. 对数学操作使用本机代码。每个数学操作都会产生委托调用的开销。

我刚刚开始了32位浮点数学的软件实现。在2.66GHz的i3上,它每秒可以完成大约7000万次的加法/乘法运算。https://github.com/CodesInChaos/SoftFloat。很明显,它还很不完整,而且充满了问题。

票数 55
EN

Stack Overflow用户

发布于 2011-07-13 13:44:37

C#规范(§4.1.6浮点类型)特别允许使用高于结果的精度进行浮点计算。所以,不,我不认为你可以让这些计算直接在.Net中确定。其他人提出了各种解决办法,这样你就可以尝试它们了。

票数 28
EN

Stack Overflow用户

发布于 2011-07-13 11:41:45

在需要这些操作的绝对可移植性的情况下,下面的页面可能很有用。讨论了IEEE 754标准的测试实现软件,包括模拟浮点操作的软件。然而,大多数信息可能是特定于C或C++的。

http://www.math.utah.edu/~beebe/software/ieee/

--关于不动点的一点注记

二进制不动点数字也可以很好地代替浮点,这从四个基本算术运算中可以看出:

  • 加法和减法都是微不足道的。它们的工作方式和整数一样。只是加或减!
  • 要乘两个不动点数,将这两个数字相乘,然后右移定义的小数位数。
  • 若要除以两个不动点数,请将红利移除所定义的小数位数,然后除以除数。
  • “哈坦加迪”(2007年)第四章对实现二元不动点数提供了额外指导(S.K. Hattangady,"DSP分块浮点间隔ALU的研制及控制应用",北卡罗莱纳州立大学硕士论文,2007年)。

二进制不动点数字可以在任何整数数据类型上实现,如int、long和BigInteger,以及不兼容CLS的类型uint和ulong。

正如在另一个答案中所建议的,您可以使用查找表,其中表中的每个元素都是二进制不动点数,以帮助实现复杂的函数,如正弦、余弦、平方根等等。如果查找表的粒度小于不动点数,则建议将查找表的粒度的一半添加到输入中,从而绕过输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Assume each number has a 12 bit fractional part. (1/4096)
// Each entry in the lookup table corresponds to a fixed point number
//  with an 8-bit fractional part (1/256)
input+=(1<<3); // Add 2^3 for rounding purposes
input>>=4; // Shift right by 4 (to get 8-bit fractional part)
// --- clamp or restrict input here --
// Look up value.
return lookupTable[input];
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6683059

复制
相关文章
Linux 没有可用的软件包
事实上我已经使用了最新的镜像源配置, 但是在安装软件的提示: 没有可用软件包. 比如在使用 yum install nginx -y 命令时遇到“没有可用软件包 nginx”的错误,这通常意味着你的系统的 YUM 仓库中没有 Nginx 的安装包。要解决这个问题,你可以按照以下步骤操作:
chuchur
2024/12/27
1180
高可用方法论!
永不停机总归是不现实的。那么,在可操作性的范围内,怎样把影响降到最小,而影响又该怎么衡量呢?
Coder的技术之路
2022/09/19
3150
高可用方法论!
hdp 不更新了,有没有办法将 Apache Hadoop 代替 hdp 并集成到 Ambari 中呢?
今天咱来聊一聊 Ambari 如何集成 Apache Hadoop 哈,自从 cloudera 公司将 hortonworks 公司收购后,hdp 就不迭代更新了,这对 Apache Ambari 也产生了很大影响,毕竟 Ambari 与 hdp 耦合性很强。
create17
2022/11/17
3.4K1
解决g++: error: /usr/lib/libuuid.a: 没有那个文件或目录
****uuid是什么**** UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准。 ---- 今天编译源码竟然出现这样的问题:g++: error: /usr/lib/libuuid.a: 没有那个文件或目录。 使用sudo apt-get install uuid-dev安装uuid开发接口后, 头文件/usr/include/uuid/uuid.h存在,但是libuuid.so.1.*和libuuid.a找不到 ---- ****
AlicFeng
2018/06/08
2.5K0
再论软件工程没有银弹
上篇文章论述了软件工程之所以不存在银弹是因为,软件工程本身存在复杂性,一致性,不可预见性,不可视化性。有些专家就这个问题持有相反的观点,大致可以分为以下几种
用户5166556
2019/04/16
1.6K0
安装Ambari和HDP
最新的CDH已经没有了社区版,也就是说以后使用新版本的Cloudera Manager和CDH都是要收费的,这对于很多小公司来说,可能无法承受。转向Ambari是他们的一个可选项。Ambari是Apache的一个顶级开源项目,开源是其最大的优势,开源也意味着Ambari可以灵活地进行扩展,集成更多的数据组件,对于需要定制化和二次开发的企业来说,Ambari也极具吸引力。
soundhearer
2020/10/15
3.2K0
安装Ambari和HDP
集群搭建篇(ambari+HDP)—— 全网最详细的,没有之一
1、服务器环境1.1 修改主机名称1.2 修改ip地址1.3 linux修改hosts并添加集群主机1.4 windows修改hosts文件并添加集群主机2、免密配置2.1 切换root用户2.2 生成公钥与私钥对2.3 将公钥复制到目标机器,并测试免密登录是否成功2.4 集群其他主机免密配置2.5 异常演示3、关闭防火墙3.1 防火墙设置3.2 设置之后3.3 设置之前4、禁用selinux4.1 selinux介绍4.2 设置selinux5、安装JDK5.1 上传jdk5.2 配置Java环境变量5.3 检查Java环境是否生效6、安装mysql6.1 mysql安装6.2 mysql设置6.3 修改密码6.4 上传驱动7、安装httpd服务7.1 httpd介绍7.1 安装httpd服务7.2 查看httpd服务7.3 tips:网页访问本地文件内容8、安装ntp服务8.1 ntp介绍8.2 安装8.3 修改ntp.conf配置8.4 时钟同步8.5 检查时钟同步效果9、搭建yum环境和创建ambari本地源9.1 安装yum工具9.2 安装9.3 创建repo文件9.4 分发repo文件9.4 生成本地yum源10、安装ambari10.1 在mysql中创建ambari用户和授权10.2 安装ambari10.2 初始化配置10.3 初始化ambari数据库10.4 启动ambari10.5 报错及解决10.6 ambari页面配置步骤10.6.1 第1步 启动安装10.6.2 第2步 输出集群名称10.6.3 第3步 选择版本、选择本地仓库及路径10.6.4 第4步 输入集群节点名称、私钥10.6.5 节点认证10.6.6 选择服务10.6.7 分配主节点10.6.8 分配从节点和客户端10.6.9 自定义服务10.6.10 确认配置10.6.11 安装部署11、启动服务11.1 java权限问题11.2 hive元数据初始化
大数据最后一公里
2021/08/05
2.5K0
集群搭建篇(ambari+HDP)—— 全网最详细的,没有之一
g++: error trying to exec 'cc1plus': execvp: 没有那个文件或目录
这个错误是gcc和g++版本不兼容导致的,也有可能是安装完gcc没有安装g++ 首先安装gcc和g++及一些依赖包 sudo apt-get install build-essential sudo apt-get install g++ 安装完成后使用 gcc -v 查看版本,然后使用g++ -v 查看版本,保证版本一致 如果系统中安装有多个版本的gcc 那么就需要ln一下,我的机器上边安装的是4.3的,所以执行命令如下 sudo ln -sf g++-4.3 /usr/bin/g++ sudo ln
cloudskyme
2018/03/20
3.6K0
Ambari 与 HDP 安装指南
大数据平台,涉及到很多软件产品,如果刚刚入行Hadoop,直接下载软件包,手动配置文件的方式,并没有那么直观和容易。
星哥玩云
2022/07/13
1.2K0
Ambari 与 HDP 安装指南
【集合论】关系闭包 ( 自反闭包 | 对称闭包 | 传递闭包 )
包含给定的元素 , 并且 具有指定性质 的 最小的 集合 , 称为关系的闭包 ; 这个指定的性质就是关系
韩曙亮
2023/03/28
4.1K0
【集合论】关系闭包 ( 自反闭包 | 对称闭包 | 传递闭包 )
Ambari + HDP 整体介绍
    Ambari 是 hortonworks推出的管理监控Hadoop集群的Web工具,此处的Hadoop集群不单单指Hadoop集群,而是泛指hadoop 整个生态,包括Hdfs,yarn,Spark,Hive,Hbase,Zookeeper,druid等等,管理指的是可以通过Ambari对整个集群进行动态管理,包括集群的部署,修改,删除,扩展等,监控指Ambari实时监控集群的运行状况,包括运行内存,剩余内存,CPU使用率,节点故障等。所以通过Ambari可以简化对集群的管理和监控,让开发者更多的聚焦与业务逻辑。     Ambari + HDP介绍:         Ambari:WEB应用程序,后台为Ambari Server,负责与HDP部署的集群工作节点进行通讯,集群控制节点包括Hdfs,Spark,Zk,Hive,Hbase等等。         HDP:HDP包中包含了很多常用的工具,比如Hadoop,Hive,Hbase,Spark等         HDP-Util:包含了公共包,比如ZK等一些公共组件。     老的集群部署方式:         1. 集群配置(免密登陆,静态IP,防火墙)         2. JDK,MySql 部署 (Hive相关表结构管理,如果没有用到Hive,无需安装)         3. Hadoop Hdfs 部署(修改配置) (分布式文件存储)         4. Hadoop Yarn 部署(修改配置) (MapReduce 任务调度)         5. (可选) Zookeeper部署,需要修改NameNode 和 ResourceManager 的配置文件         6. Hive 部署 (数据仓库,对Hdfs上保存的数据进行映射管理)         7. HBase 部署 (NoSQL数据库,进行数据存储)         8. (可选) Flume,Sqoop 部署(主要用于数据采集,数据迁移)         9. Spark 部署 (计算框架部署)         10. 后面还需要部署 监控框架等等,         部署准备:MySql,JDK,Hadoop,Hive,HBase,Zookeeper,Spark,Flume,Sqoop等         部署缺点:以上全部部署都是通过命令行来部署,麻烦复杂,容易出错,动态扩展较难,无集群监控    部署优点:整体可控,对集群内部运行逻辑比较清楚,只部署需要的服务,所以对集群要求(内存,CPU及硬盘) 可以不是很高     Ambari 集群部署方式:         1. 集群配置(免密登陆,静态IP,防火墙)         2. JDK,MySql 部署 (需要配置Ambari,Hive,Hbase等多张表)         3. 部署Ambari 服务         4. 通过Ambari Web工具 部署Hdfs,Spark,Hive,Zk,Hbase,Flume等,想怎么部署就怎么部署,鼠标选择服务和需要部署的节点即可         5. 通过Ambari Web工具进行集群监控,并且对警告及错误进行处理         部署准备:MySql,JDK,Ambari,HDP,HDP-Util,和上面老的部署方式相比,是不是少了很多    部署注意事项:通过Ambari部署集群对集群节点机器要求比较高,因为有好多关于AmbariServer服务会部署在同一个管理节点上,同时其他集群节点也会同时部署很多其他服务,这对节点的配置(CPU,内存,硬盘)要求比较高,可能运行不起来。         部署优点:部署简单,一键部署,方便监控,方便扩展,多集群同时管理     Ambari 部署步骤:         1. 单节点:Ntp,java,selinux,hosts,hostname,ip         2. 克隆节点,修改ip及hostname         3. 安装mysql,配置免密登陆         4. 安装httpd,配置本地ambari+HDP 的yum源         5. Ambari Server安装及初始化         6. Ambari Server 通过向导安装集群         7. Ambari 使用介绍         8. Hdfs HA的高可用         9. 接下来就可以根据我们的需求使用集群了,这部分后面会有专门章节针对Hadoop MR 和Spark进行详细解读。
Freedom123
2024/03/29
2310
谁说Postgresql 没有靠谱的高可用
上期说到了见证服务器,见证服务器的功能到底有什么用,其实如同各种高可用中(这里说的是完备的高可用)大部分都是三台,因为怕什么,怕脑裂,因为高可用要面对的问题是很多的,尤其网络的问题,如果因为网络的原因造成服务器本身没有问题,但在网络断开的某个时间段造成了,主从切换,则就会造成双主的尴尬现象。所以在数据中心或比较关键的业务中,使用的数据库服务器的高可用也是要妥妥当当的。wintness不是一个成熟的备用节点,也没有集成到复制中,但是在决定哪个网络段占多数时,它有效地代表了“投票”。可以使用repmgr见证寄存器设置见证服务器。但前提是你必须使用repmgrd ,每个节点都需要运行这个程序(如果你不知道什么是repmgrd 请参看之前的文字 1 2 3 )
AustinDatabases
2019/12/26
1.9K2
谁说Postgresql 没有靠谱的高可用
大数据平台HDP搭建
在ambari的setup中我们可以选择使用默认的postgresql,也可以自定义使用其他数据库,此处选用mariadb,便于后期管理维护
KaliArch
2018/05/29
2.5K3
大数据平台HDP搭建
如何使用C++通过thrift访问HBase进行操作
上周六,接了一个紧急任务,说实现使用 C++ 访问 HBase 进行操作。说是用 thrift 来实现。对于 C++ 来说,我真的是门外汉,但需求如此,皱着眉头也要把它实现。好歹在同事的帮助下,也是实现了 demo 示例,现在就把这两天的成果分享给大家。
create17
2019/05/14
3.3K0
如何使用C++通过thrift访问HBase进行操作
CDH和HDP下载地址
版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/chengyuqiang/article/details/88966887
程裕强
2019/07/01
8.9K1
CDH和HDP下载地址
【集合论】关系闭包 ( 关系闭包相关定理 )
文章目录 一、关系闭包相关定理 ( 闭包运算不动点 ) 二、关系闭包相关定理 ( 闭包运算单调性 ) 三、关系闭包相关定理 ( 闭包运算与并运算之间的关系 ) 四、传递闭包并集反例 一、关系闭包相关定理 ( 闭包运算不动点 ) ---- R 关系是 A 集合上的二元关系 , R \subseteq A , 且 A 集合不为空集 , A \not= \varnothing R 关系是自反的 , 当且仅当 R 关系的自反闭包 r ( R ) 也是 R 关系本身 ; R 自反 \Le
韩曙亮
2023/03/28
6740
【集合论】关系闭包 ( 关系闭包相关定理 )
g++入门教程
g++是GNU开发的C++编译器,是GCC(GNU Compiler Collection)GNU编译器套件的组成部分。另外,gcc是GNU的C编译器。
恋喵大鲤鱼
2019/02/22
14.8K1
g++编译链接多个文件
代码示例main.cpp#include "test1.h"int main() { test1(); return 0;}test1.h#ifndef __TEST1_H#define __TEST1_Hconst int kVar = 1; // 测试不使用externvoid test1();#endiftest1.cpp#include <iostream>#include "test1.h"using namespace std;void test1() {
村子里的设计师
2023/05/20
1.4K0
gcc和g++的区别
gcc 最开始的时候是 GNU C Compiler, 如你所知,就是一个c编译器。但是后来因为这个项目里边集成了更多其他不同语言的编译器,GCC就代表 the GNU Compiler Collection,所以表示一堆编译器的合集。 g++则是GCC的c++编译器。 现在你在编译代码时调用的gcc,已经不是当初那个c语言编译器了,更确切的说他是一个驱动程序,根据代码的后缀名来判断调用c编译器还是c++编译器 (g++)。比如你的代码后缀是*.c,他会调用c编译器还有linker去链接c的library。如果你的代码后缀是cpp, 他会调用g++编译器,当然library call也是c++版本的。 当然我说了这么多你可能感到有些混乱,没关系,你就把gcc当成c语言编译器,g++当成c++语言编译器用就是了。
bear_fish
2018/09/19
2.8K0
谁说postgresql 没有靠谱的高可用(3)
1 failover='automatic' #如果侦测到失败,则进行自动切换,默认为手动
AustinDatabases
2019/12/24
2.6K1
谁说postgresql  没有靠谱的高可用(3)

相似问题

“没有包<包name>可用。”?

10

列出所有没有binay包的可用源包

10

在CentOS 5.7上没有git包可用

20

PPA没有列出所有可用的php包。

10

没有软件包mssql-可用的工具

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文