Tại Sao Sử Dụng Abs () Hoặc Fabs () Thay Vì Phủ Định Có Điều Kiện?

Xem 5,445

Cập nhật thông tin chi tiết về Tại Sao Sử Dụng Abs () Hoặc Fabs () Thay Vì Phủ Định Có Điều Kiện? mới nhất ngày 29/07/2021 trên website Zdungk.com. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Cho đến thời điểm hiện tại, bài viết này đã đạt được 5,445 lượt xem.

--- Bài mới hơn ---

  • Hàm Atoi() Trong C++ Hoạt Động Như Thế Nào?
  • Chức Năng Atoi () Trong C++ Hoạt Động Như Thế Nào?
  • Hướng Dẫn Sử Dụng Các Hàm Xử Lý Chuỗi Trong C/c++
  • Các Cấu Trúc Dữ Liệu Trong C++
  • Làm Quen Với Multithreading Trong C++
  • Trình biên dịch rất có thể sẽ làm điều tương tự cho cả hai ở lớp dưới cùng – ít nhất là một trình biên dịch có thẩm quyền hiện đại.

    Tuy nhiên, ít nhất là đối với dấu phẩy động, cuối cùng bạn sẽ viết vài chục dòng nếu bạn muốn xử lý tất cả các trường hợp đặc biệt vô cực, không phải là số (NaN), số 0 âm, v.v.

    Cũng như dễ đọc hơn rằng abs đang lấy giá trị tuyệt đối so với việc đọc nếu nó nhỏ hơn 0, hãy phủ nhận nó.

    Nếu trình biên dịch là “ngu ngốc”, thì cuối cùng nó cũng có thể làm mã kém hơn cho a = (a < 0)?-a:a, bởi vì nó buộc if (ngay cả khi nó bị ẩn), và điều đó cũng có thể tệ hơn so với tích hợp hướng dẫn abs dấu phẩy động trên bộ xử lý đó (ngoài độ phức tạp của các giá trị đặc biệt)

    Cả Clang (6.0-phát hành trước) và gcc (4.9.2) đều tạo mã WORSE cho trường hợp thứ hai.

    Tôi đã viết mẫu nhỏ này:

    clang tạo mã này cho func1:

    _Z5func1v: # @_Z5func1v movl intval(%rip), %eax movl %eax, %ecx negl %ecx cmovll %eax, %ecx movss floatval(%rip), %xmm0 # xmm0 = mem[0],zero,zero,zero andps .LCPI0_0(%rip), %xmm0 movl %ecx, intval(%rip) movss %xmm0, floatval(%rip) retq _Z5func2v: # @_Z5func2v movl intval(%rip), %eax movl %eax, %ecx negl %ecx cmovll %eax, %ecx movss floatval(%rip), %xmm0 movaps .LCPI1_0(%rip), %xmm1 xorps %xmm0, %xmm1 xorps %xmm2, %xmm2 movaps %xmm0, %xmm3 cmpltss %xmm2, %xmm3 movaps %xmm3, %xmm2 andnps %xmm0, %xmm2 andps %xmm1, %xmm3 orps %xmm2, %xmm3 movl %ecx, intval(%rip) movss %xmm3, floatval(%rip) retq

    g ++ func1:

    _Z5func1v: movss .LC0(%rip), %xmm1 movl intval(%rip), %eax movss floatval(%rip), %xmm0 andps %xmm1, %xmm0 sarl $31, %eax xorl %eax, intval(%rip) subl %eax, intval(%rip) movss %xmm0, floatval(%rip) ret

    g ++ func2:

    _Z5func2v: movl intval(%rip), %eax movl intval(%rip), %edx pxor %xmm1, %xmm1 movss floatval(%rip), %xmm0 sarl $31, %eax xorl %eax, %edx subl %eax, %edx ucomiss %xmm0, %xmm1 jbe .L3 movss .LC3(%rip), %xmm1 xorps %xmm1, %xmm0 .L3: movl %edx, intval(%rip) movss %xmm0, floatval(%rip) ret

    Lưu ý rằng cả hai trường hợp phức tạp hơn đáng kể ở dạng thứ hai và trong trường hợp gcc, nó sử dụng một nhánh. Clang sử dụng nhiều hướng dẫn hơn, nhưng không có chi nhánh. Tôi không chắc cái nào nhanh hơn trên các mẫu bộ xử lý, nhưng rõ ràng nhiều hướng dẫn hơn hiếm khi tốt hơn.

    --- Bài cũ hơn ---

  • Lớp Lưu Trữ (Storage Class) Trong C/c++
  • Lớp Và Đối Tượng Trong C++
  • Phân Biệt Abstract Class Và Interface Trong C++
  • Vòng Lặp Do While Trong C++
  • While Và Do…while Trong C++
  • Bạn đang xem bài viết Tại Sao Sử Dụng Abs () Hoặc Fabs () Thay Vì Phủ Định Có Điều Kiện? trên website Zdungk.com. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!

  • Tin tức online tv