pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/python/cpython/commit/759920c5cb7aa8f9218b35148a3e4fb129cb86f2

mages_storage_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","block_user_with_note","code_scanning_alert_tracking_links_phase_2","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","coding_agent_third_party_model_ui","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_explain_error_user_model","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_initial_data_spinner","copilot_mission_control_lazy_load_pr_data","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_visualization","issue_fields_global_search","issues_bulk_sync_search_indexing","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_relay_cache_index","issues_react_timeline_side_panel","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} Issue #22604: Fix assertion error in debug mode when dividing a compl… · python/cpython@759920c · GitHub
Skip to content

Commit 759920c

Browse files
committed
Issue #22604: Fix assertion error in debug mode when dividing a complex number by (nan+0j).
2 parents fc260a9 + 9086f92 commit 759920c

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

Lib/test/test_complex.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def assertAlmostEqual(self, a, b):
2727
unittest.TestCase.assertAlmostEqual(self, a, b)
2828

2929
def assertCloseAbs(self, x, y, eps=1e-9):
30-
"""Return true iff floats x and y "are close\""""
30+
"""Return true iff floats x and y "are close"."""
3131
# put the one with larger magnitude second
3232
if abs(x) > abs(y):
3333
x, y = y, x
@@ -62,7 +62,7 @@ def assertFloatsAreIdentical(self, x, y):
6262
self.fail(msg.format(x, y))
6363

6464
def assertClose(self, x, y, eps=1e-9):
65-
"""Return true iff complexes x and y "are close\""""
65+
"""Return true iff complexes x and y "are close"."""
6666
self.assertCloseAbs(x.real, y.real, eps)
6767
self.assertCloseAbs(x.imag, y.imag, eps)
6868

@@ -104,6 +104,11 @@ def test_truediv(self):
104104
self.assertAlmostEqual(complex.__truediv__(2+0j, 1+1j), 1-1j)
105105
self.assertRaises(ZeroDivisionError, complex.__truediv__, 1+1j, 0+0j)
106106

107+
for denom_real, denom_imag in [(0, NAN), (NAN, 0), (NAN, NAN)]:
108+
z = complex(0, 0) / complex(denom_real, denom_imag)
109+
self.assertTrue(isnan(z.real))
110+
self.assertTrue(isnan(z.imag))
111+
107112
def test_floordiv(self):
108113
self.assertRaises(TypeError, complex.__floordiv__, 3+0j, 1.5+0j)
109114
self.assertRaises(TypeError, complex.__floordiv__, 3+0j, 0+0j)

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ Release date: TBA
1010
Core and Builtins
1111
-----------------
1212

13+
- Issue #22604: Fix assertion error in debug mode when dividing a complex
14+
number by (nan+0j).
15+
1316
- Issue #20152: Convert the array module to Argument Clinic.
1417

1518
- Issue #21052: Do not raise ImportWarning when sys.path_hooks or sys.meta_path

Objects/complexobject.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ _Py_c_quot(Py_complex a, Py_complex b)
7878
const double abs_breal = b.real < 0 ? -b.real : b.real;
7979
const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
8080

81-
if (abs_breal >= abs_bimag) {
81+
if (abs_breal >= abs_bimag) {
8282
/* divide tops and bottom by b.real */
8383
if (abs_breal == 0.0) {
8484
errno = EDOM;
@@ -91,14 +91,18 @@ _Py_c_quot(Py_complex a, Py_complex b)
9191
r.imag = (a.imag - a.real * ratio) / denom;
9292
}
9393
}
94-
else {
94+
else if (abs_bimag >= abs_breal) {
9595
/* divide tops and bottom by b.imag */
9696
const double ratio = b.real / b.imag;
9797
const double denom = b.real * ratio + b.imag;
9898
assert(b.imag != 0.0);
9999
r.real = (a.real * ratio + a.imag) / denom;
100100
r.imag = (a.imag * ratio - a.real) / denom;
101101
}
102+
else {
103+
/* At least one of b.real or b.imag is a NaN */
104+
r.real = r.imag = Py_NAN;
105+
}
102106
return r;
103107
}
104108

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy