- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有:
float a = 3 // (gdb) p/f a = 3
float b = 299792458 // (gdb) p/f b = 299792448
Sau đó
float sum = a + b // (gdb) p/f sum = 299792448
我认为这与尾数移动有关。有人可以解释到底发生了什么吗? 32位
câu trả lời hay nhất
32-bit floats只有 24 位精度。因此, float 不能准确地包含 b
- 它通过设置一些指数和尾数以尽可能接近 1 来尽力而为。 (最接近源中常量的可表示trôi nổi
;默认的 FP 舍入模式是“nearest”。)
然后当您考虑 b
Và Một
的浮点表示,并尝试将它们相加时,加法运算将移动小数 Một
的尾数向下,因为它试图匹配 b
的指数,直到值 (3) 从末尾掉下来,剩下 0。因此,加法运算符结束将浮点零加到 b
。 (这是一种过度简化;如果存在部分尾数重叠,低位仍会影响舍入。)
一般情况下,无限精度加法结果必须用当前的 FP 舍入模式舍入到最接近的 trôi nổi
,而这恰好等于 b
。
另见 Why adding big to small in floating point introduce more error?对于数字发生一些变化但舍入误差较大的情况,例如使用十进制有效数字作为帮助理解二进制 float 舍入的一种方式。
脚注 1:对于这么大的数字,最近的两个 float 相距 32。现代铿锵 warns关于将源中的 số nguyên
舍入为表示不同值的 trôi nổi
。除非您已经将其写为 float 或 double 常量(如 299792458.0f
),在这种情况下舍入会在没有警告的情况下发生。
这就是为什么最小的 Một
值会将 tổng hợp
向上舍入为 299792480.0f
而不是向下舍入为 299792448.0f
大约是 16.000001 的 b
值,四舍五入为 299792448.0f
。可运行示例 on the Godbolt compiler explorer .
默认的 FP 舍入模式舍入到最接近的偶数尾数作为平局。 16.0 刚好走到一半,因此四舍五入到 0x4d8ef3c2 的位模式,而不是 0x4d8ef3c3。 https://www.h-schmidt.net/FloatConverter/IEEE754.html .任何略大于 16 的值都向上舍入,因为舍入关心的是无限精度的结果。它不会实际上在添加之前移出位,这是一种过度简化。最接近 16.000001 的 float 仅在其尾数中设置了低位,位模式 0x41800001。它实际上大约是 1.0000001192092896 x 24,或 16.0000019... 小得多,它会四舍五入到恰好 16.0f 并且 <= 1 ULP(单位在最后一位) b
,这不会改变 b
,bởi vì b
的尾数已经是偶数。
如果您通过使用 double a,b
避免提前舍入,您可以添加的最小值向上舍入 299792480.0f
而不是向下舍入到 299792448.0f
当你执行 float sum = a+b
时大约是 a=6.0000001;
,这是有道理的,因为整数值 ...58 保持为 。 ..58.0
而不是向下舍入为 ...48.0f
,Ngay lập tức float b = ...58
中的舍入误差为 -10,因此 Một
可以小得多。
不过这次有两个舍入步骤,a+b
四舍五入到最接近的 gấp đôi
如果加法不精确,那么 gấp đôi
四舍五入为 trôi nổi
。 (或者如果 FLT_EVAL_METHOD
== 2,就像 C 在 32 位 x86 上编译 80 位 x87 float 一样,+
结果将四舍五入为 80 位 dài gấp đôi
,然后到 trôi nổi
)
关于c - 为什么将小 float 添加到大 float 只会降低小 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22186589/
#include sử dụng không gian tên std; lớp C{ riêng tư: int giá trị; công khai: C(){ giá trị = 0;
Câu hỏi này đã có câu trả lời: Sự khác biệt giữa char a[] = ?string?; và char *p = ?string?;? (8 câu trả lời) Đã đóng
đóng cửa. Câu hỏi này yêu cầu chi tiết hoặc rõ ràng. Câu trả lời không được chấp nhận vào thời điểm này. Bạn muốn cải thiện câu hỏi này? Thêm chi tiết và làm rõ câu hỏi bằng cách chỉnh sửa bài đăng này Đã đóng 7 năm trước. Bài đăng này đã được 8 tháng rồi
Ngoài việc gỡ lỗi, có công cụ kiểm tra nào cho c, c++ hoặc c# hoạt động giống như các hàm độc lập dán sao chép vào một số hộp văn bản rồi nhập tham số vào các hộp văn bản khác không? Câu trả lời hay nhất Có lẽ bạn sẽ xem xét thử nghiệm đơn vị. Tôi khuyên bạn nên kiểm tra google và google mô phỏng
Tôi muốn di chuyển một cửa sổ (HWND) trong màn hình thứ hai. Vấn đề là tôi đã thử rất nhiều cách như tăng gấp đôi độ phân giải hoặc nhập giá trị âm, nhưng nó không bao giờ đặt cửa sổ trên màn hình thứ hai của tôi. Mọi manh mối về cách thực hiện việc này trong C/C++/C# sẽ hữu ích nhất
Tôi đang tìm kiếm các triển khai hiện có của các loại DES khác nhau trong C/C++/C##. Nền tảng đang chạy của tôi là Windows XP/Vista/7. Tôi đang cố gắng viết chương trình C# sẽ sử dụng thuật toán DES để mã hóa và giải mã. Tôi cần một số thực tế
Thật khó để nói những gì để hỏi ở đây. Câu hỏi không rõ ràng, mơ hồ, không đầy đủ, quá rộng hoặc hùng biện và không thể trả lời hợp lý ở dạng hiện tại. Để được trợ giúp làm rõ vấn đề này để có thể mở lại, hãy truy cập trung tâm trợ giúp Đóng 1.
Có cách nào để buộc một cửa sổ khác ở trên cùng không? Không phải cửa sổ của ứng dụng mà là một cửa sổ khác đang chạy trên hệ thống. (Windows, C/C++/C#) Câu trả lời hay nhấtSetWindowPos(that_window_ha
Giả sử bạn có lựa chọn giữa C/C++ hoặc Csharp và bạn dự định chạy nhiều phiên bản của cùng một máy chủ trên máy chủ Windows và Linux, đâu là lựa chọn thông minh nhất để xây dựng một ứng dụng máy chủ socket? Câu trả lời tốt nhất là như
Bạn có thể cho tôi biết sự khác biệt giữa chúng? Nhân tiện, có thứ gì được gọi là thư viện C++ hay thư viện C không? Câu trả lời hay nhất Thư viện chuẩn C++ và thư viện chuẩn C là các thư viện được xác định theo tiêu chuẩn C++ và C và được cung cấp để các chương trình C++ và C sử dụng. Đó là điểm chung của những từ đó
Trong mã kiểm tra bên dưới, tôi đưa thông tin đầu ra vào phần bình luận. Tôi đang sử dụng gcc 4.8.5 và Centos 7.2. #include #include lớp C { công khai:
Thật khó để nói những gì đang được hỏi ở đây. Câu hỏi mơ hồ, mơ hồ, không đầy đủ, quá rộng hoặc hùng biện và không thể trả lời hợp lý ở dạng hiện tại. Để được trợ giúp làm rõ vấn đề này để bạn có thể mở lại, hãy truy cập trung tâm trợ giúp. Đã đóng
Khách hàng của tôi sẽ sử dụng cấu trúc/lớp được gọi là thông báo để liên lạc với khách hàng. Tôi nghĩ tôi sẽ viết máy chủ bằng C++. Sẽ có nhiều lớp khác nhau kế thừa thông báo. Vấn đề của tôi là gửi các lớp này qua mạng tới máy khách. Tôi nghĩ có lẽ tôi nên sử dụng
Tôi có hàm sau trong C#: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
Tôi có một dự án mà tôi phải viết một hàm để thực hiện một số thao tác nhất định trên một số dữ liệu. Tôi có thể viết mã bằng C/C++, nhưng tôi không muốn chia sẻ mã của chức năng này với chủ nhân của mình. Thay vào đó, tôi chỉ muốn anh ấy có quyền gọi hàm bằng mã của riêng mình. Có thể được không? Tôi đã nghĩ đến hai phương pháp này - trong
Tôi đang sử dụng API của bên thứ 3 (C/C++) được viết kém. Tôi đang sử dụng nó từ mã được quản lý (C++/CLI). Đôi khi xảy ra "Lỗi vi phạm quyền truy cập". Điều này làm hỏng toàn bộ ứng dụng. Tôi biết tôi không thể xử lý những lỗi này [nếu con trỏ truy cập vào vị trí bộ nhớ không hợp lệ, v.v.
đóng cửa. Câu hỏi này không tuân thủ các nguyên tắc của Stack Overflow. Hiện tại nó không chấp nhận câu trả lời. Chúng tôi không cho phép các câu hỏi tìm kiếm đề xuất về sách, công cụ, thư viện phần mềm, v.v. Bạn có thể chỉnh sửa câu hỏi của mình để trả lời bằng sự kiện và trích dẫn. Đóng cửa 7 năm trước
Đã đóng cửa. Câu hỏi này không tuân thủ nguyên tắc Stack Overflow. Câu trả lời không được chấp nhận vào thời điểm này. Các câu hỏi yêu cầu chúng tôi giới thiệu hoặc tìm các công cụ, thư viện hoặc tài nguyên bên ngoài trang web yêu thích đều không có chủ đề đối với Stack Overflow vì
Tôi có một số mã C sẽ được gọi từ C# bằng P/Invoke. Tôi đang cố gắng xác định tương đương C# cho hàm C này. SomeData* DoSomething(); struct SomeData {
Câu hỏi này đã có câu trả lời: Tại sao các cấu trúc này sử dụng hành vi không xác định trước và sau tăng? (14 câu trả lời) Đã đóng 6
Tôi là một lập trình viên xuất sắc, rất giỏi!