Вывод чисел типа float. Переполнение мантисы - C#

Узнай цену своей работы

Формулировка задачи:

Пишу:
float f = 1.9999994f;
Console.WriteLine(f);
 
//Выводит 1.999999 без 4-ки
Затем меняю 4 на 5 в конце:
float f = 1.9999995f;
Console.WriteLine(f);
 
//Выводит 2
Почему происходит "округление" до 2, если в памяти число 1.9999995 выглядет по IEEE 754 так: Т.е. переполнение мантисы не происходит. А переполняется она при числе 1.99999995 (на одну 9ку больше): И почему пишут точность float 6-7 знаков если она всегда 7?

Решение задачи: «Вывод чисел типа float. Переполнение мантисы»

textual
Листинг программы
using System;
using System.Runtime.InteropServices;
                    
public class Program
{
    [StructLayout(LayoutKind.Explicit)]
    struct ByteArray {
      [FieldOffset(0)]
      public UInt32 Integer;
      [FieldOffset(0)]
      public Single Floating;
      [FieldOffset(0)]
      public byte Byte0;
      [FieldOffset(1)]
      public byte Byte1;
      [FieldOffset(2)]
      public byte Byte2;
      [FieldOffset(3)]
      public byte Byte3;
    }
    
    public static void Main()
    {
        ByteArray b = new ByteArray();
        b.Floating = 1.9999994f;
        Console.WriteLine("{0:x2} {1:x2} {2:x2} {3:x2}", b.Byte0, b.Byte1, b.Byte2, b.Byte3);
        Console.WriteLine("{0:f9}", b.Floating);
        Console.WriteLine("{0:r}", b.Floating);
        Console.WriteLine("{0:x4}", b.Integer);
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5
Похожие ответы