给定一个浮点数,我想将它分成一个部分之和,每个部分都有给定的位数.例如,给定3.1415926535并告诉它将其分成10个基本的10个部分,每个4位数,它将返回3.141 + 5.926E-4 + 5.350E-8.实际上,我想将一个double(具有52位精度)分成三个部分,每个部分具有18位精度,但是使用base-10示例更容易解释.我不一定反对使用标准双精度IEEE浮点数的内部表示的技巧,但我真的更喜欢纯粹保留在浮点范围内的解决方案,以避免任何与字节序相关或非标准的问题浮点表示.
不,这不是一个家庭作业问题,是的,这有实际用途.如果要确保浮点乘法是精确的,则需要确保乘以的任何两个数字永远不会超过浮点类型中有空格的数字的一半.从这种分解开始,然后将所有部分相乘并进行卷积,就是这样做的一种方法.是的,我也可以使用任意精度的浮点库,但只涉及几个部分时,这种方法可能会更快,而且它肯定会更轻.
以下是一些代码,它通过定期在后台线程上打印写流的位置来监视磁盘的写入进度,同时将10 GB的数据写入磁盘:
string path = "test.out";
long size = 10 * 1000L * 1000L * 1000L;
using (FileStream writer = new FileStream(path, FileMode.Create, FileAccess.Write))
{
// Get a handle (and don't do anything with it)
var handle = writer.SafeFileHandle;
// Start a background position reader
ThreadPool.QueueUserWorkItem(s =>
{
while (true)
{
Console.WriteLine(writer.Position);
Thread.Sleep(10);
}
});
// Write out the bits
byte[] buffer = new byte[4096];
long position = 0;
while (position < size)
{
int count = (int)Math.Min(size - position, …Run Code Online (Sandbox Code Playgroud)