Tag: 浮点

C#中浮点数和双数据类型的实际范围是多少?

我正在学习C#并尝试在C#中获得实际数据类型范围的逻辑直观表示。 我已经移动了整数,现在我浮动和双数据类型。 8位(1字节),sbyte,-128到127。 8位(1字节),字节,0到255。 16位(2字节),短,-32,768到32,767。 16位(2字节),ushort,0到65535。 32位(4字节),int,-2,147,483,648到2,147,483,647。 32位(4字节),uint,0到4,294,967,295。 64位(8字节),长,-9,223,372,036,854,775,808到9,223,372,036,854,775,807 64位(8字节),ulong,0到18,446,744,073,709,551,615。 以下是msdn中float和double数据类型大小的引用: Float: http : //msdn.microsoft.com/en-us/library/b1e65aza( v= vs.110).aspx 双倍: http : //msdn.microsoft.com/en-us/library/678hzkk9.aspx 因此,试图遵循上面编号列表中指定实际数字范围的惯例,这两个范围实际代表什么?

任何人都可以向我解释这个浮点怪异吗?

我试图循环遍历浮点数的​​所有可能值,如下所示: float i = 0.0F; float epsilon = float.Epsilon; while (i != float.MaxValue) { i += epsilon; } 但在达到2.3509887E-38F后,它会停止增加。 float init = 2.3509887E-38F; float f = (init + float.Epsilon); Console.WriteLine(f == init); 我只是好奇,有人能解释为什么吗? 因此,我可以在舍入错误之前将epsilon添加到浮点数16777216次,并且该数字看起来非常熟悉(2 ^ 24)。

System.Convert.ToSingle()问题,(1.5)vs(1,5)

我正在用C#编写程序,用于在模型格式之间进行转换。 模型格式的数字为文本,例如“-0.136222”。 我可以使用System.Convert.ToSingle()将其转换为浮点数。 但是在德国,我们使用逗号作为小数点(-0,136222),System.Convert就此选择了。 现在我遇到的问题是它没有识别小数点,因为它需要逗号。 简而言之; 我们有这个:“ – 0.136222”我们得到这个:-0136222.0f,因为它期望这个:“ – 0,136222” 我可以告诉系统只为我的程序识别逗号作为小数点吗? 解决方法不起作用,因为它需要可移植(到其他国家)。

确定操作是否会导致溢出?

我的应用程序中有一些代表物理单位的类,例如温度。 这些类能够使一些单元与它们相关联并进行更改,例如Celcius和Kelvin。 它们还具有用户定义的最大值和最小值。 当我想要改变单位时,我得到两个给定单位之间的转换因子,然后通过用转换因子执行一些算术运算来改变类中的Min , Max和Data值。 Double ConversionFactor = GetConversionFactor(curUnits, newUnits); Units = newUnits; Min *= ConversionFactor; Max *= ConversionFactor; Data *= ConversionFactor; 我遇到的问题是,有时用户可能允许max和min值为某些类型的MinValue和MaxValue ,例如Double 。 如果用户要更改转换因子大于1的单位,则会导致溢出。 在C#中是否有办法检测溢出和下溢是否会发生这种溢出? 从我可以告诉我的一些测试,我认为我只需要检查操作的结果是否不等于正或负无穷大? 如果是这样,我可以将值设置回MinValue或MaxValue 。 另外,奖金问题。 在我的测试中,我发现如果我创建一个Double max = Double.MaxValue并添加一些小到100的东西。 该值不会改变。 为什么是这样? MaxValue和PositiveInfinity之间是否有一些阈值,因为精度MaxValue而且值很大?

浮点差异取决于调试构建的运行方式

我正在使用调试版本并在同一台机器上获得不同的结果,无论我是否在调试器下运行。 我使用优秀的TestDriven.Net来运行unit testing。 使用TestDriven.Net或外部NUnit运行程序“运行”会产生相同的结果 使用TestDriven.Net“使用调试器运行”会产生不同的结果 代码是 一种复杂的迭代网格变形程序,涉及浮点精度极限的重要计算 C#,VS2012瞄准.Net 3.5。 单线程 只有调试版本,没有构建版本 同一台机器,没有省电\ speedstep或我所知道的其他function Vanilla C# – 没有不安全的代码,非托管库,平台调用等。 没有调试器检查代码或奇怪的第三方库 我没有追溯到第一个区别(没有调试器就很棘手!)但考虑到代码是如何迭代的,它的输入敏感性和最小的差异将在给定足够时间的情况下增长到相当大的比例。 我知道编译器,平台和架构之间的fp重现性是多么脆弱,但是发现调试器是导致这种情况失败的因素之一令人失望。 我是否必须接受这个作为生活中的事实,或者您可以提供任何建议吗?

如何处理大多数小数部分无法用二进制精确表示的事实?

因此,我们知道诸如0.1之类的分数无法在二进制基数中准确表示,这会导致精确的问题(例如此处提到的: 格式化C#中输出的双精度数 )。 我们知道数字的十进制表示有十进制类型…但问题是,很多数学方法,不支持十进制类型,所以我们将它们转换为double,这再次破坏了数字。 那我们该怎么办?

c#中的打印增量为0.1

我目前正在阅读Steve McConnell撰写的Code Complete,特别是关于浮点数的第295页。 当我运行以下代码时: double nominal = 1.0; double sum = 0.0; for (int i = 0; i < 10; i++) { sum += 0.1; Console.WriteLine("sum: " + sum.ToString()); } if (equals(nominal,sum)) { Console.WriteLine("Numbers are the same"); } else { Console.WriteLine("Numbers are different"); } 我得到的印刷品为0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0数字不同 为什么我没有得到假设发生的输出? […]

为什么在将字符串转换为float时会出现FormatException?

当我尝试将字符串转换为float时: Console.WriteLine(float.Parse(“6.59”)); 它引发了一个exception: 未处理的exception:System.FormatException:输入字符串不在正确的格式中。 at System.Number.ParseSingle(String value,NumberStyles options,NumberFormat Info numfmt) 当我这样尝试时: Console.WriteLine(Convert.ToSingle(“6.59”)); 它引发了同样的exception: 未处理的exception:System.FormatException:输入字符串不在正确的格式中。 at System.Number.ParseSingle(String value,NumberStyles options,NumberFormat Info numfmt) 在System.Convert.ToSingle(String value) 你能解释一下为什么会这样吗?

确定是否可以用float / double格式精确表示数字

如何确定一个数字,例如1.577,是否可以用float或double格式精确表示? 这意味着它是真正的1.577而不是1.566999999999994324等。 编辑:我正在寻找一个工具,我可以在其中键入一个数字,它将显示它的双/浮点表示。 所以这不仅仅是c#相关的问题。

在c#中接受浮点不准确有什么好处?

在过去的 几天里,我脑子里已经遇到了这个问题,我很难说出我的问题。 但是,我想我已经固定了我想知道的东西。 为什么c#通过使用浮点来存储数据来接受不准确? 使用它比其他方法有什么好处? 例如, Math.Pow(Math.Sqrt(2),2)在c#中并不精确。 有些编程语言可以精确计算它(例如,Mathematica)。 我能想到的一个论点是,计算它确实比仅仅应对不准确要慢得多,但Mathematica和Matlab用于计算巨大的科学问题,所以我发现很难相信这些语言真的比c#慢得多。 那么为什么呢? PS:我很抱歉用这些问题向你发送垃圾邮件,你们都非常乐于助人