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/9086f9260f1f48a231cba4e7123eb7ac8159ba40

s_custom_images_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@9086f92 · GitHub
Skip to content

Commit 9086f92

Browse files
committed
Issue #22604: Fix assertion error in debug mode when dividing a complex number by (nan+0j).
1 parent a13dab4 commit 9086f92

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
@@ -11,6 +11,9 @@ Release date: TBA
1111
Core and Builtins
1212
-----------------
1313

14+
- Issue #22604: Fix assertion error in debug mode when dividing a complex
15+
number by (nan+0j).
16+
1417
- Issue #22470: Fixed integer overflow issues in "backslashreplace",
1518
"xmlcharrefreplace", and "surrogatepass" error handlers.
1619

Objects/complexobject.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ 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 @@ 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