Làm mới trên floating points (cũng PDF), IEEE-754 và tham gia in this discussion on floating point rounding when converting to strings, đưa tôi đến tinker: làm cách nào để có được giá trị tối đa và tối thiểu cho số dấu chấm động có biểu diễn nhị phân bằng nhau.Tìm min/max của float/double có cùng biểu diễn nội bộ
Tuyên bố từ chối: đối với thảo luận này, tôi thích gắn với điểm nổi 32 bit và 64 bit như được mô tả bởi IEEE-754. Tôi không quan tâm đến điểm nổi mở rộng (80 bit) hoặc quad (128 bit IEEE-754-2008) hoặc bất kỳ tiêu chuẩn nào khác (IEEE-854).
Bối cảnh: Máy tính không tốt đại diện cho 0.1
trong biểu diễn nhị phân. Trong C#, một phao đại diện cho số này là 3DCCCCCD
trong nội bộ (C# sử dụng vòng-đến-gần nhất) và một đôi là 3FB999999999999A
. Các mẫu bit giống nhau được sử dụng cho số thập phân 0.100000005
(phao) và 0.1000000000000000124
(gấp đôi), nhưng không được sử dụng cho 0.1000000000000000144
(đôi).
Để thuận tiện, mã C# dưới đây đưa ra những tuyên bố nội bộ:
string GetHex(float f)
{
return BitConverter.ToUInt32(BitConverter.GetBytes(f), 0).ToString("X");
}
string GetHex(double d)
{
return BitConverter.ToUInt64(BitConverter.GetBytes(d), 0).ToString("X");
}
// float
Console.WriteLine(GetHex(0.1F));
// double
Console.WriteLine(GetHex(0.1));
Trong trường hợp của 0.1
, có số thập phân không thấp mà được thể hiện với các mẫu bit cùng, bất kỳ 0.99...99
sẽ mang lại một khác nhau biểu diễn bit (ví dụ: float cho 0.999999937
sản lượng 3F7FFFFF
nội bộ).
Câu hỏi của tôi rất đơn giản: làm cách nào để tìm giá trị thập phân thấp nhất và cao nhất cho một float (hoặc double) được lưu trữ trong cùng một biểu diễn nhị phân.
Tại sao: (Tôi biết bạn sẽ hỏi) để tìm lỗi trong làm tròn trong .NET khi chuyển đổi thành chuỗi và khi nó chuyển đổi từ chuỗi, để tìm giá trị chính xác nội bộ và để hiểu làm tròn lỗi tốt hơn.
Đoán của tôi giống như: lấy phần định trị, loại bỏ phần còn lại, lấy giá trị chính xác, lấy giá trị (mantissa-bit) cao hơn và tính giá trị trung bình: bất kỳ thứ gì dưới đây sẽ mang lại cùng một mẫu bit. Vấn đề chính của tôi là: làm thế nào để có được phần phân số như số nguyên (bit thao tác nó không phải là tài sản mạnh nhất của tôi). Jon Skeet's DoubleConverter lớp học có thể hữu ích.
Câu trả lời hay, có vẻ như thông tin tôi đang tìm kiếm. Tôi sẽ cố gắng làm việc trong C# và quay lại đây nếu tôi cần thêm trợ giúp về các mẩu tin. Tôi nhận thấy bạn đã làm việc với đội ngũ IEEE-754 để xây dựng tiêu chuẩn? Tôi rất vinh dự :). Và bạn rất đúng về lỗi đánh máy đó! Tôi đã rất ngạc nhiên rằng tôi không thể tìm thấy một giá trị thấp hơn, nhưng tôi đã lấy nó cho các cấp và viết nó xuống, lỗi và tất cả, lol! – Abel